найти-exec cmd {} + vs / xargs
какой из них более эффективен над очень большим набором файлов и должен использоваться?
find . -exec cmd {} +
или
find . | xargs cmd
(предположим, что в именах файлов нет забавных символов)
3 ответов
разница в скорости будет незначительной.
но вы должны убедиться, что:
ваш скрипт не будет считать, что нет файл будет иметь пространство, вкладку и т. д имя файла; первая версия безопасно, второе-нет.
ваш скрипт не будет обрабатывать файл, начинающийся с "
-
" как вариант.
так что ваш код должен выглядеть это:
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