Скрипт удаления файлов старше N дней

Версия для печатиОтправить другуPDF version

Для бекапирования данных можно использовать как специализированное ПО, так и самописные скрипты.

В случае использования самописных скриптов, возникает необходимость периодически удалять архивы бекапов. Однако и этот процесс можно автоматизировать.

Попытаемся максимально приблизить условия к боевым.

Итак, имеется в наличии сервер, на котором в родительском каталоге (например, /backup) созданы подкаталоги, для хранения бекапов в зависимости от типа содержимого:

  • конфигурации маршрутизаторов
  • конфигурации коммутаторов
  • конфигурации серверов
  • данные с серверов
  • т.д.

Логика написания скрипта состоит в следующем. В зависимости от типа содержимого, скорости устаревания данных, доступного дискового пространства и т.д, выбираем оптимальное время хранения бекапов в каталогах. После этого необходимо "пройтись" по каталогах и удалить все файлы, которые созданы более чем N дней назад.

Для поиска файлов, которые созданы более чем N дней назад, воспользуемся возможностями утилиты find.

Допустим, необходимо найти в каталоге все файлы, созданные более 25 дней назад:

# find /backup/jun -type f -mtime +25
/backup/jun/juniper.conf.gz_20150209_141842
/backup/jun/juniper.conf.gz_20150209_142441
/backup/jun/juniper.conf.gz_20150209_142733
/backup/jun/juniper.conf.gz_20150209_151936
/backup/jun/juniper.conf.gz_20150209_152555
/backup/jun/juniper.conf.gz_20150209_173457

 После поиска устаревших файлов, необходимо их удалить. Для этого можно использовать, например, такую конструкцию:

find /backup/jun -type f -mtime +25 -exec rm -f {} \;

 Либо же такую:

find /backup/jun -type f -mtime +25 -print0 | xargs -0 rm -f

Воспользуемся вторым вариантом и добавим несколько переменных. В результате получаем примерно следующий скрипт:

#!/bin/sh

# Путь к утилите поиска
FIND="/usr/bin/find"
# Путь к утилите удаления
RM="/bin/rm"
# Путь к утилите xargs
XARGS="/usr/bin/xargs"

# Список каталогов с архивами бекапов
PATH1="/backup/jun"
PATH2="/backup/sw"

# Время хранения файлов (в днях)
TIME1="25"
TIME2="60"

# Перебираем каталоги и удаляем устаревшие бекапы
$FIND $PATH1 -type f -mtime +$TIME1 -print0 | $XARGS -0 $RM -f
$FIND $PATH2 -type f -mtime +$TIME2 -print0 | $XARGS -0 $RM -f

Назовем его, например, remove_old_backups.sh и запустим на выполнение:

# sh /usr/local/etc/remove_old_backups.sh

После этого проверим наличие файлов старше 25 дней в каталоге /backup/jun:

find /backup/jun -type f -mtime +25

Таких файлов не обнаружено. А вот, для примера, файлы старше 20 дней - присутствуют:

find /backup/jun -type f -mtime +20
/backup/jun/juniper.conf.gz_20150210_124853
/backup/jun/juniper.conf.gz_20150212_145222
/backup/jun/juniper.conf.gz_20150212_151451
/backup/jun/juniper.conf.gz_20150212_151608
/backup/jun/juniper.conf.gz_20150213_033623
/backup/jun/juniper.conf.gz_20150213_033643
/backup/jun/juniper.conf.gz_20150213_033751
/backup/jun/juniper.conf.gz_20150213_113431

Скрипт работает... Модифицируем под свои нужды и пользуемся.

По завершению редактирования, в целях безопасности, выставим необходимые права и разшешения (у меня файлы архивов пишутся от имени пользователя proftpd):

# chown proftpd:proftpd /usr/local/etc/remove_old_backups.sh
chmod 700 /usr/local/etc/remove_old_backups.sh

Ну и не забываем добавить ежедневный запуск скрипта в планировщик заданий:

# echo '# Clear old backups' >> /etc/crontab
echo '2       6       *       *       *       proftpd    /bin/sh /usr/local/etc/remove_old_backups.sh' >> /etc/crontab

 

Ваша оценка: Нет Средняя: 5 (1 голос)

Re: Скрипт удаления файлов старше N дней

Добавлю свои 5 копеек
Два однострочника для логов:
1 для сжатия
2 для подчистки за ним
10 0 * * * find /var/log/host68/ \( -name '*' -a ! -name '*.gz' \) -type f -mtime +0 |  xargs gzip -9
10 0 * * * find /var/log/host68/ -name '*.gz' -mtime +60 | xargs rm

Re: Скрипт удаления файлов старше N дней

Раньше тоже так делал. Пока не пришло осознание, что лучше старый бекап, чем никакого. Все бывает, верно? И если по каким-то причинам бекап перестал выполняться, то find все также будет удалять файлы, пока не останется ни одного. При этом сообщение об ошибке при выполнении бекапа, например, на тот же email, также не помешает.

# remove old files
_SaveFilesCount=100
_AllFilesCount=`ls |wc -l`
if [ $_AllFilesCount -gt $_SaveFilesCount ]; then
        let "_RmFilesCount = $_AllFilesCount - $_SaveFilesCount"
        rm -f `ls -t |tail -$_RmFilesCount`
fi

Re: Скрипт удаления файлов старше N дней

лучше старый бекап, чем никакого

полностью согласен

а можно коментарии к вашему скрипту, где что виполняется, т.к. я новичок и не все тут понимаю

Re: Скрипт удаления файлов старше N дней

а чего не понятного то?
данный скрипт выполняется для текущей директории.
_SaveFilesCount=100 # минимальное количество файлов, которое должно остаться.
_AllFilesCount=`ls |wc -l` # общее количество файлов в директории.
if [ $_AllFilesCount -gt $_SaveFilesCount ]; then # условие - если общее количество файлов больше чем минимальное то...
let "_RmFilesCount = $_AllFilesCount - $_SaveFilesCount" # вычисление количества удаляемых файлов.
rm -f `ls -t |tail -$_RmFilesCount` # собственно, получение _RmFilesCount последних элементов, сортированного по дате модификации, в порядке более старые в конце, списка файлов в директории и их удаление.
fi

собственно только в данном виде скрипт не удобен для автоматизации. в начале следовало бы указать:
_BackupDir=<путь к директории>

и

cd $_BackupDir
или же думаю лучше
pushd $_BackupDir
<основной текст скрипта>
popd

Re: Скрипт удаления файлов старше N дней

Вам может и все понятно, а мне не все, топому и спрашивал. Спасибо за разжовывание.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература

Офисная мудрость: Как файл не называй - всё равно когда понадобится хрен найдёшь!