find -exec cmd {} + vs | xargs - PullRequest
       11

find -exec cmd {} + vs | xargs

109 голосов
/ 22 мая 2009

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

find . -exec cmd {} +

или

find . | xargs cmd

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

Ответы [ 3 ]

102 голосов
/ 22 мая 2009

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

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

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

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

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

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

или

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

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

8 голосов
/ 22 мая 2009
find . | xargs cmd

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

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

find . -print0 | xargs -0 cmd

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

2 голосов
/ 24 апреля 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...