Удаление старых файлов Linux (старше N дней)


Удаление старых файлов в Linux является операцией необходимой для того чтобы не допустить заполнения диска. Обычно удалению подлежат однотипные старые файлы — логи, часто — файлы сессий РНР. Если система их ротирования, сжатия и удаления не настроена оптимально логи могут занимать значительное пространство, если же свободного места на сервере остается меньше 10% в его работе могут наблюдаться трудности.



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


Удаление старых файлов linux по маске чаще всего осуществляется следующим образом:

rm -rf /var/log/apache2/*.log



Веб-сервер указан для примера. Синтаксис очень прост — команда принудительно удалит все файлы с расширением .log в указанном каталоге, при этом удаление будет рекурсивным(-r — recursive) и подтверждения система при этом спрашивать не будет (-f — force).



При удалении таким образом очень большого количества файлов из определенного каталога может выдавать ошибки — причина в том, что система на самом деле не видит маски и разворачивает передаваемое ей выражение — срабатывает ограничение на количество аргументов, и выполнение команды прекращается.



Если rm -rf не помогает — удалять файлы следует в цикле for. Для каждого файла будет отдельная операция удаления и никаких ограничений системы здесь ожидать не приходится.



Синтаксис в простейшем случае может выглядеть так:

for f in /var/log/apache2/*.log; do rm «$f»; done


В цикл for можно добавить любую дополнительную логику.



Удаление по Cron файлов старше N дней


Логи или другие файлы (сессии РНР) можно удалять как используя циклы (так приходится делать обычно если логов или других файлов  накопилось действительно очень много).


Если система не запущена для большого количества пользователей или только создается лучше использовать регулярно выполняемое задание Cron, согласно которому с заданной периодичностью будут удаляться файлы определенных типов. При регулярном выполнении операции очень много файлов скопиться не успеет и цикл не потребуется.



# m h  dom mon dow   command

23 3 * * * find /var/www/site/www/var/session/ -type f -mtime 7 -exec rm -f {} \;

В примере удаляются сессии РНР для сайта (тип документа 'файл', время создания — больше 7 дней).


Как любое cron задание команду на удаление файлов можно проверить выполнив её вручную. При успешном выполнении вывода не будет:

Удаление старых файлов Linux


В цикле то же самое можно сделать так:

for f in /tmp/logs/*.log

do

find $f -mtime +7 -exec rm {} \;

done



Приведенное выражение, как и любой другой цикл можно поместить в файл, сделать его исполняемым и с тем же успехом выполнять по Cron

Сказать спасибо