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