Ответы:
Разница в скорости будет незначительной.
Но вы должны убедиться, что:
Ваш сценарий не будет предполагать, что в имени файла не будет места, табуляции и т.д. первая версия безопасна, вторая нет.
Ваш сценарий не будет рассматривать файл, начинающийся с " -
", как вариант.
Итак, ваш код должен выглядеть так:
find . -exec cmd -option1 -option2 -- {} +
или
find . -print0 | xargs -0 cmd -option1 -option2 --
Первая версия короче и проще для написания, так как вы можете игнорировать 1, но вторая версия более переносима и безопасна, поскольку " -exec cmd {} +
" является относительно новой опцией в GNU findutils (с 2005 года во многих работающих системах ее еще нет) и он недавно был глючен . Также многие люди не знают этого " -exec cmd {} +
", как вы можете видеть из других ответов.
exec
сбило с толку - использование будет выводить результаты по мере их нахождения, тогда xargs
как, похоже, будет ждать, пока не будет проведен поиск по всему каталогу, прежде чем писать в стандартный вывод. Если вы пробуете это сделать с большим каталогом, и вам кажется, что xargs
это не работает, рекомендуется набраться терпения.
-print0
find возвращает имена файлов, разделенные символом новой строки, но новая строка также может быть частью имени файла, что делает его неоднозначным. Байт 0 не может, поэтому это безопасный разделитель. Да - добавление --
к команде, которая поддерживает эту функцию, является хорошей практикой, когда вы не можете контролировать ее аргументы, даже если это не всегда строго требуется или небезопасно.
find . | xargs cmd
более эффективен (он запускается cmd
как можно меньше раз, в отличие от того exec
, который запускается cmd
один раз для каждого матча). Однако вы столкнетесь с проблемами, если имена файлов будут содержать пробелы или забавные символы.
Предлагается использовать следующее:
find . -print0 | xargs -0 cmd
это будет работать, даже если имена файлов содержат забавные символы ( -print0
делает find
вывод совпадений, заканчивающихся NUL, -0
заставляет xargs
ожидать этот формат.)
xargs
подход на самом деле значительно медленнее, если нет (или всего несколько) совпадающих файлов, и cmd
для каждого файла не нужно много делать. Например, при запуске в пустом каталоге xargs
версия займет как минимум в два раза больше времени, так как нужно запустить два процесса вместо одного. (Да, разница обычно незаметна на * nix, но в цикле это может быть важно; или, попробуйте когда-нибудь в Windows ...)