Как подавить определенные сообщения об ошибках в команде «find»?

Как подавить определенные сообщения об ошибках в команде «find»?

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/и управлять произвольными файлами журналов таким образом. Рассмотрите этот подход.

Связанный контент