Существует несколько способов сделать это, включая циклы в shell-скрипте, find и xargs. Какой из них лучше, а какой самый портативный?
command-line
scripting
directory
find
Брайан Литтл
источник
источник
-name "*.c"
или, например,-type d
для каталогов ...find ... | xargs ...
идиому, она обрабатывает файлы в пакетном режиме, и это обычно будет быстрее (меньше запущенных процессов).Используйте
-print0
опцию для поиска и-0
опцию,xargs
если у вас есть имена файлов или каталогов с пробелами:-print0
Возможность найти распечатывает имена файлов какNUL
-разделенное , а не пробелами список разделенных, в то время как-0
опцияxargs
инструктирует их , чтобы разбить его на вход ,NUL
а не пробелами. ПосколькуNUL
это один из символов, который не допускается в именах файлов Unix, его нельзя принять за часть имени файла.-r
Вариант есть , так чтоxargs
не будет выдавать ошибку , если он не имеет входа.источник
Если бы переносимость была проблемой, я бы держался подальше от специфических для оболочки способов сделать это (есть много людей, использующих множество различных оболочек, но в целом find и xargs - действительно базовые инструменты, которые никто не осмелится радикально изменить) ,
Использование основных аргументов find и xargs должно дать вам более переносимое решение.
источник
Если группировка аргументов приемлема, найдите | Вероятно, xargs даст лучшую производительность, так как он будет выполнять команду намного реже, чем find -exec. Если вы хотите выполнять команду каждый раз для каждого файла или выполнять в подкаталоге файла, вам, вероятно, следует использовать find -exec или -execdir.
Как правило, предпочтительнее держаться подальше от специфичных для оболочки циклов; find & xargs достаточно для большинства сценариев.
источник
Убедитесь, что версия команды, которую вы используете, еще не имеет флага для рекурсивной операции. :)
источник
Лучше всего работает для меня.
источник