find /var/log/myfile.*.txt -type f
Если файла, соответствующего этому шаблону, нет, я получаю журналы ошибок типа No such file or directory
.
Вопрос: как мне предотвратить только это сообщение об ошибке? Я, конечно, мог бы добавить 2>/dev/null
в конце, но это подавило бы любые ошибки. Как я мог бы просто проигнорировать упомянутое?
Потому что у меня есть cronjob, который периодически удаляет некоторые файлы и всегда регистрирует ошибки, если файл отсутствует:
@daily find /var/log/myfile.*.txt -mtime +7 -delete
решение1
В этом случае правильнее всего вообще не показывать это сообщение.
Когда вы запускаете это в оболочке
find /var/log/myfile.*.txt -type f
/var/log/myfile.*.txt
расширяется оболочкой; find
получает развернутый объект(ы) или литерал, /var/log/myfile.*.txt
если совпадений нет. В последнем случае запускается No such file or directory
.
Сначала вы можете создать фиктивный файл: touch '/var/log/myfile.dummy_name.txt'
(сравнитеслон в Каире). Хотя это «решение» не совсем элегантно.
Лучшим решением будет сделать find
шаблон handle:
find /var/log/ -type f -name "myfile.*.txt"
где двойные кавычки предотвращают подстановку в оболочке (сравнитеэтот). В этом случае *
обрабатывается сам собой, find
поскольку -name
поддерживает такие шаблоны.
Однако вышеописанный подход может myfile.*.txt
совпадатьлюбой подкаталога /var/log/
также. Если вы find
поддерживаете -maxdepth
, используйте его:
find /var/log/ -maxdepth 1 -type f -name "myfile.*.txt"
Если нет, посмотрите это:Ограничить поиск POSIX определенной глубиной?
Ваша ОС, вероятно, уже использует logrotate(8)
для управления файлами журналов.
В моем Debian logrotate
запускается ежедневно из-за /etc/cron.daily/logrotate
; в Ubuntu должно быть похоже. Я могу создать пользовательскую конфигурацию /etc/logrotate.d/
и управлять произвольными файлами журналов таким образом. Рассмотрите этот подход.