Ответ вслух Junior grep, sed, awk, find, xargs обновлено

find, -exec и xargs

Вопрос

Как найти и удалить файлы логов старше 14 дней? Какие варианты есть и чем они отличаются?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Самый простой вариант: find /var/log/app -name '.log' -mtime +14 -delete. Маску беру в кавычки, иначе shell раскроет её в текущем каталоге.

Что должно прозвучать в ответе

  • `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 ошибок.