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

У меня есть задача удалить все файлы, которые старше 90 дней из /dir/prd/log recrusively, т. Е. Удалить из поддиректорий тоже. Я сделал эту команду:

 find /dir/prd/log* -mtime +90 | xargs rm 

Затем я разговаривал с парнем Unix, и он предложил

 find /dir/prd/log* -mtime +90 -print | xargs rm -f 

Я просто хочу знать, что было бы его целью поместить команды «-print» и «-f» в команду.

One Solution collect form web for “В чем разница между результатами и эффективностью после добавления -f в rm и -print в поиске?”

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

Здесь, в зависимости от реализации xargs stdin 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 и filename, попросив 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 '{}' + 
  • Почему xargs пропускает первый аргумент при передаче в подоболочку?
  • cmd2 `cmd1` vs cmd1 | xargs cmd2
  • Измените код ASP на PHP-код во всех файлах
  • Удаление некоторых из самых больших файлов в каталоге
  • Используйте массив bash в качестве списка аргументов в списке (с помощью Midnight Commander)
  • Отправка списка вакансий в slurm
  • Пропустить флаги для xargs
  • Поиск строки в каталоге. Получить вывод без имени файла.
  • xargs repl_str не расширяет второй заполнитель
  • Преобразование строк новой строки в нуль-ограничение при использовании хвоста
  • cp после того, как xargs не работает
  • Linux и Unix - лучшая ОС в мире.