
Кажется, есть несколько способов сделать это, включая циклы в скрипте оболочки, find и xargs. Какой из них лучше и какой наиболее переносим?
решение1
find . -exec <command> {} \;
для текущего каталога как корня дерева или в общем случае:
find <directory> -exec <command> {} \;
решение2
Используйте -print0
опцию find и -0
опцию to xargs
, если имена файлов или каталогов содержат пробелы:
find {dir} -print0 | xargs -0r {command}
Параметр -print0
find выводит имена файлов в виде NUL
списка, разделенного -, а не пробелами, в то время как -0
параметр to xargs
указывает, что нужно разбить ввод на -, NUL
а не на пробел. Поскольку NUL
это один из символов, недопустимых в именах файлов Unix, его невозможно спутать с частью имени файла.
Эта -r
опция есть, поэтому она xargs
не выдаст ошибку, если нет входных данных.
решение3
Если переносимость является проблемой, я бы воздержался от использования специфичных для оболочки способов (многие используют множество различных оболочек, но в целом find и xargs — это действительно базовые инструменты, которые никто не рискнет радикально менять).
Использование базовых аргументов find и xargs должно дать вам более переносимое решение.
решение4
Убедитесь, что версия команды, которую вы используете, еще не имеет флага для рекурсивной операции. :)