find, -exec и xargs
Вопрос
Как найти и удалить файлы логов старше 14 дней? Какие варианты есть и чем они отличаются?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`find /var/log/app -name '*.log' -mtime +14 -delete` самый простой и безопасный
Маску в кавычках, иначе shell раскроет её сам
`-exec rm {} \;` запускает rm на каждый файл, `{} +` пачками
`xargs` без `-0` ломается на пробелах, правильно `-print0 | xargs -0`
Сначала запуск без удаления (`-print`), чтобы проверить выборку
Для ротации логов лучше logrotate, а не ручной find в cron
Что могут спросить следом
- Что значит
-mtime +14точно? - Как удалить ещё и пустые каталоги?
- Как ограничить глубину поиска?
Разбор
Самый простой вариант: find /var/log/app -name '*.log' -mtime +14 -delete. Маску беру в кавычки, иначе shell раскроет её в текущем каталоге. Перед удалением запускаю то же самое с -print и смотрю список. -mtime +14 значит возраст больше 14 полных суток. Если нужна другая команда, есть -exec: с \; она запускается на каждый файл, с + пачками, что намного быстрее. Можно через xargs, но только в паре find -print0 | xargs -0, иначе имя с пробелом развалится на два аргумента и, в худшем случае, удалится не тот файл. Глубину ограничивает -maxdepth, пустые каталоги удаляет find -type d -empty -delete. А в продакшене за старыми логами должен следить logrotate или journald с лимитами, ручной find в cron это костыль.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.