В чем разница между результатами и эффективностью после добавления -f в rm и -print в find?

Для проверки использования ввода-вывода я обычно использую iotop . Он не установлен по умолчанию в дистрибутиве, но вы можете легко получить его с помощью:

sudo apt-get install iotop

Затем запустите его с привилегиями root:

sudo iotop --only

Параметр - only покажет только процессы, которые в настоящее время обращаются к вводу-выводу.

image of iotop in a terminal

4
20.04.2017, 15:46
1 ответ

-f указывает rm никогда не запрашивать (например, при обнаружении файлов только для чтения) и игнорировать отсутствующие файлы его просят удалить (вместо указания на ошибку). Он также не будет жаловаться, если не передан какой-либо файл для удаления.

Здесь, в зависимости от реализации xargs, стандартным вводом rm будет либо канал из find, либо /dev/null , так что без -f find может прочитать ответ на эти подсказки из вывода find!

-print — это действие по умолчанию для find в дистрибутивах Linux и POSIX-совместимых системах, но может потребоваться явное указание в очень старых Unix или Unix-подобные системы.

Таким образом, его целью, вероятно, было сделать команду более надежной и переносимой. Вы могли бы добиться большего успеха с некоторыми вариантами find (выходя за рамки POSIX):

find /dir/prd/log -mtime +90 -print0 | xargs -0 rm -f

позволяет избежать проблем с именами файлов, содержащими «специальные» символы (включая пробел, новую строку, табуляцию, одинарную кавычку, двойную кавычку, обратную косую черту), и если ваш find поддерживает действие -delete,

find /dir/prd/log -mtime +90 -delete

позволяет избежать порождения других процессов для выполнения удаления (а также позволяет избежать некоторых проблем с состоянием гонки). (Обратите внимание, что я указываю здесь /dir/prd/log, чтобы соответствовать вашему заявленному требованию из первого предложения вашего вопроса, как подтверждено в комментариях.)

С POSIX find вы по-прежнему можете избежать xargs и синтаксического анализа имен файлов, попросив find запустить сам rm:

find /dir/prd/log -mtime +90 -exec rm -f '{}' +

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

Если /dir/prod/log содержит подкаталоги, вы можете отфильтровать их, чтобы избежать сообщений об ошибках, поскольку rm не может их удалить:

find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +
17
27.01.2020, 20:46

Теги

Похожие вопросы