Что быстрее, 'find -exec' или 'find | xargs -0 '? - PullRequest
7 голосов
/ 11 июня 2009

В моем веб-приложении я отрисовываю страницы, используя PHP-скрипт, а затем генерирую из них статические HTML-файлы. Статический HTML предоставляется пользователям для ускорения работы. HTML-файлы рано или поздно устаревают и должны быть удалены.

Я обсуждаю два способа написания сценария выселения.

Первая использует одну команду поиска, например

find /var/www/cache -type f -mmin +10 -exec rm \{} \;

Вторая форма - через xargs, что-то вроде

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm

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

Какая форма будет быстрее?

В моем случае каталог кэша используется несколькими веб-серверами, так что все это делается через NFS, если это имеет значение для этой проблемы.

Ответы [ 3 ]

15 голосов
/ 15 ноября 2009

Версия xargs значительно быстрее с большим количеством файлов, чем версия -exec, когда вы ее опубликовали, потому что rm выполняется один раз для каждого файла , который вы хотите удалить, тогда как xargs будет объедините как можно больше файлов в одну команду rm.

При наличии десятков или сотен тысяч файлов разница может составлять не более минуты от лучшей части часа.

Вы можете получить то же поведение с -exec, завершив команду с помощью «+» вместо «\;». Эта опция доступна только в более новых версиях find.

Следующие два примерно эквивалентны:

find . -print0 | xargs -0 rm
find . -exec rm \{} +

Обратите внимание, что версия xargs будет все еще работать немного быстрее (на несколько процентов) в многопроцессорной системе, потому что часть работы может быть распараллелена. Это особенно верно, если много вычислений.

6 голосов
/ 11 июня 2009

Я ожидаю, что версия xargs будет немного быстрее, поскольку вы не запускаете процесс для каждого имени файла. Но я был бы удивлен, если бы на самом деле была большая разница в практике. Если вас беспокоит длинный список, который xargs отправляет при каждом вызове rm, вы можете использовать -l с xargs, чтобы ограничить число используемых им токенов. Тем не менее, xargs знает самую длинную длину cmdline и не пойдет дальше.

2 голосов
/ 01 марта 2011

Команда find имеет встроенную опцию -delete, возможно, это также может быть полезно? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

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