-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 '{}' +
Проблема обнаружена. Используя ad_access_filter в sssl.conf, компьютер Linux должен иметь разрешения на чтение объекта пользователя в AD. После разговора с нашим системным администратором он дал разрешение, и теперь оно работает ... :)
Я добился этого, отредактировав /etc/security/pam_winbind.conf
require_membership_of = S-1-5-21-361205316-2009527927-3895120483-1111,localgroup1
, вы можете вычислить строку S-1 -... с помощью wbinfo -G "User all"