Короткий ответ — find /var/log/app -type f -mtime +30 -delete. Длинный: сначала запустите то же самое без -delete, потому что неудачный вариант этой команды уносит каталог целиком. Ниже — безопасный порядок, сформулированный так, как вы бы сказали вслух.
1. Сначала покажи, что удалится
$ clai покажи файлы в /var/log/app старше 30 дней, ничего не удаляй→ find /var/log/app -type f -mtime +30 -printf '%TY-%Tm-%Td %p\n'2026-06-01 /var/log/app/app-june.log2026-07-10 /var/log/app/app-july.log
find без действия просто печатает. Прочитайте список, прежде чем ему доверять, — именно этот шаг обычно и пропускают.
2. Сколько места это реально освободит
$ clai сколько места освободят эти старые файлы→ find /var/log/app -type f -mtime +30 -printf '%s\n' | awk '{s+=$1} END {printf "%.1f KB in %d files\n", s/1024, NR}'6.0 KB in 2 files
Если в ответе пара килобайт — проблема с диском не здесь, и можно остановиться.
3. Теперь удалить
$ clai удали эти файлы старше 30 дней→ find /var/log/app -type f -mtime +30 -delete
При успехе -delete не печатает ничего. Эта тишина — норма.
4. Только .log и только верхний уровень
$ clai удали только .log старше 30 дней в /var/log/app, в подпапки не заходи→ find /var/log/app -maxdepth 1 -type f -name '*.log' -mtime +30 -delete
-maxdepth 1 — то, что не даёт ночной чистилке уйти в примонтированный том.
5. По календарной дате, а не «N дней назад»
$ clai найди файлы, изменённые до 1 июля 2026→ find /var/log/app -type f ! -newermt '2026-07-01' -printf '%TY-%Tm-%Td %p\n'2026-05-01 /var/log/app/old.txt2026-06-01 /var/log/app/app-june.log
Удобно, когда граница — дата релиза, а не скользящее окно.
6. Убрать оставшиеся пустые каталоги
$ clai удали пустые папки, которые остались в /var/log/app→ find /var/log/app -mindepth 1 -type d -empty -delete
-mindepth 1 не даёт find удалить тот каталог, на который вы его натравили.
Грабли
-deleteдолжен стоять последним.findвычисляет выражение слева направо, поэтомуfind . -delete -mtime +30удалит всё ещё до того, как дойдёт до проверки возраста. Это самая дорогая опечатка в статье.-mtime +30— это минимум 31 день.findокругляет до целых суток, а+30означает строго больше 30, так что файл возрастом 30,5 суток не попадёт под условие.- Не берите
-atime. Большинство систем монтируются сrelatime, и время доступа обновляется в лучшем случае раз в сутки. Считайте возраст по времени изменения (-mtime) или смены метаданных (-ctime).
Похожие вопросы
Почему find -delete удалил больше, чем я ожидал? Почти всегда дело в порядке флагов — см. первый пункт «Граблей». Кроме того, -delete включает -depth, а это меняет порядок обхода дерева.
Как запускать это каждую ночь? Положите проверенную команду в cron с абсолютными путями: 0 3 * * * find /var/log/app -type f -mtime +30 -delete. Сначала прогоните руками — в cron другое окружение и куда меньше свидетелей ошибки.
Работает ли это на macOS? Да, BSD-шный find понимает -mtime, -delete и -maxdepth. А вот -printf есть только в GNU — на macOS используйте -print.
Читайте также
- Подчистить старые логи и бэкапы одной фразой
- Хватит запоминать флаги find: просто попросите то, что нужно
- Cron без головоломок: «каждый понедельник в 3 ночи» → рабочее расписание
Не уверены, что команда безопасна? CliAI помечает каждую сгенерированную команду как SAFE, CAUTION или DANGER до запуска, а разрушительные требуют подтверждения вводом. Установка одной строкой.