найти-exec cmd {} + vs / xargs

какой из них более эффективен над очень большим набором файлов и должен использоваться?

find . -exec cmd {} +

или

find . | xargs cmd

(предположим, что в именах файлов нет забавных символов)

3 ответов


разница в скорости будет незначительной.

но вы должны убедиться, что:

  1. ваш скрипт не будет считать, что нет файл будет иметь пространство, вкладку и т. д имя файла; первая версия безопасно, второе-нет.

  2. ваш скрипт не будет обрабатывать файл, начинающийся с "-" как вариант.

так что ваш код должен выглядеть это:

find . -exec cmd -option1 -option2 -- {} +

или

find . -print0 | xargs -0 cmd -option1 -option2 --

первая версия короче и проще писать, так как вы можете игнорировать 1, но вторая версия является более портативной и безопасной, как"-exec cmd {} + " является относительно новым вариантом в GNU findutils (с 2005 года многие запущенные системы еще не будут иметь его), и это было багги недавно. Также многие люди не знают этого"-exec cmd {} +", как видно из других ответов.


find . | xargs cmd

более эффективно (он работает cmd как можно меньше раз, в отличие от exec, который работает cmd один раз для каждого матча). Однако, вы столкнетесь с проблемой, если имена файлов содержат пробелы или непонятные символы.

предлагается использовать следующее:

find . -print0 | xargs -0 cmd

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


современные xargsверсии часто поддерживают параллельное выполнение конвейера.

очевидно, что это может быть точкой поворота, когда дело доходит до выбора между find … -exec и … | xargs