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