Лучший способ выполнить команду для каждого файла в дереве каталогов

Лучший способ выполнить команду для каждого файла в дереве каталогов

Кажется, есть несколько способов сделать это, включая циклы в скрипте оболочки, find и xargs. Какой из них лучше и какой наиболее переносим?

решение1

find . -exec <command> {} \;

для текущего каталога как корня дерева или в общем случае:

find <directory> -exec <command> {} \;

решение2

Используйте -print0опцию find и -0опцию to xargs, если имена файлов или каталогов содержат пробелы:

find {dir} -print0 | xargs -0r {command}

Параметр -print0find выводит имена файлов в виде NULсписка, разделенного -, а не пробелами, в то время как -0параметр to xargsуказывает, что нужно разбить ввод на -, NULа не на пробел. Поскольку NULэто один из символов, недопустимых в именах файлов Unix, его невозможно спутать с частью имени файла.

Эта -rопция есть, поэтому она xargsне выдаст ошибку, если нет входных данных.

решение3

Если переносимость является проблемой, я бы воздержался от использования специфичных для оболочки способов (многие используют множество различных оболочек, но в целом find и xargs — это действительно базовые инструменты, которые никто не рискнет радикально менять).

Использование базовых аргументов find и xargs должно дать вам более переносимое решение.

решение4

Убедитесь, что версия команды, которую вы используете, еще не имеет флага для рекурсивной операции. :)

Связанный контент