CLI AI

Удалить файлы старше 30 дней в Linux, безопасно

2026-05-01

Короткий ответ — find /var/log/app -type f -mtime +30 -delete. Длинный: сначала запустите то же самое без -delete, потому что неудачный вариант этой команды уносит каталог целиком. Ниже — безопасный порядок, сформулированный так, как вы бы сказали вслух.

1. Сначала покажи, что удалится

clai
$ 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
$ 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
$ clai удали эти файлы старше 30 дней→ find /var/log/app -type f -mtime +30 -delete

При успехе -delete не печатает ничего. Эта тишина — норма.

4. Только .log и только верхний уровень

clai
$ clai удали только .log старше 30 дней в /var/log/app, в подпапки не заходи→ find /var/log/app -maxdepth 1 -type f -name '*.log' -mtime +30 -delete

-maxdepth 1 — то, что не даёт ночной чистилке уйти в примонтированный том.

5. По календарной дате, а не «N дней назад»

clai
$ 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
$ 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.

Читайте также

Не уверены, что команда безопасна? CliAI помечает каждую сгенерированную команду как SAFE, CAUTION или DANGER до запуска, а разрушительные требуют подтверждения вводом. Установка одной строкой.