найти-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