[Video] v22. Автоматическое удаление старых бекапов.

После того как бекап настроен и он работает с течением времени у вас будут накапливаться файлы на диске с этими самыми бекапами – на самом сервере, на сервере бекапов или тп.
В зависимости от размера бекапа – место на диске будет расходоваться быстрее или медленнее, что очевидно.
Скорее всего вам не пригодятся все бекапы – наиболее интересны бекапы за последний месяц. Если что-то пропало, сайт перестал работать, то скорее всего вы это быстро обнаружете.

Итак как у вас есть какая-то директория на сервере в которой храняться файлы бекапов.
Допустим, что вам не нужны файлы старше 1 месяца. Это будут исходные данные.
Теперь будем решать задачу.
Можно удалить их руками, но можно написать простейший скрипт и удалять файлы по cron.

Для начала я хочу рассказать о одной опции утилиты touch, которая помежет вам потренироваться с тестовыми файлами и не попортить нужные бекапы.
Создам серию файлов.
$ touch test-{a..z}.txt
$ ls -l
total 0
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-a.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-b.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-c.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-d.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-e.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-f.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-g.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-h.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-i.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-j.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-k.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-l.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-m.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-n.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-o.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-p.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-q.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-r.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-s.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-t.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-u.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-v.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-w.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-x.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-y.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-z.txt

Все файлы имеют дату создания и последней модификации – и это текущая дата.

Используя утилиту touch можно изменить дату последней модификации
например, на два часа назад.
touch -d "2 hours ago" test-{a..n}*
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-a.txt

или три месяца:
touch -d "3 month ago" test-{o..t}*
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-o.txt

или две недели:
touch -d "2 weeks ago" test-{u..x}*
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-u.txt

Также можно менять дату относительно даты последней модификации файла, не привязываясь к текущей дате:
touch -d "$(date -r filename) - 2 hours" filename

$ ls -l | grep test-u.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-u.txt
$ touch -d "$(date -r test-u.txt) - 2 hours" test-u.txt
$ ls -l | grep test-u.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 11:07 test-u.txt

Итак у нас есть, серия файлов с разно датой модификации – как серия бекапов.
$ ls -lt
total 0
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-z.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-a.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-b.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-c.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-d.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-e.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-f.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-g.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-h.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-i.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-j.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-k.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-l.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-m.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-n.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:00 test-y.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-v.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-w.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-x.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 11:07 test-u.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-o.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-p.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-q.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-r.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-s.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-t.txt

Теперь нужно найти устаревшие файлы.
Для этого воспользуемся утилитой find. С её помощью можно нахожить файлы у себя в системе по имени или по каком-либо другому параметку.
В данном случае, я хочу найти все файлы старше трёх месяцев (90 дней):
$ find /home/alex/mytest.dir/v22/test* -maxdepth 1 -type f -mtime +90
/home/alex/mytest.dir/v22/test-o.txt
/home/alex/mytest.dir/v22/test-p.txt
/home/alex/mytest.dir/v22/test-q.txt
/home/alex/mytest.dir/v22/test-r.txt
/home/alex/mytest.dir/v22/test-s.txt
/home/alex/mytest.dir/v22/test-t.txt

Я указал путь к директории с бекапами, указал, что не надо заходить в поддиректории если таковые имеются – ” -maxdepth 1 “ -это для безопасности, чтобы не удалить случайно другие-нужные файлы. Также указал шаблон для поиска файлов – “test*” . Шаблон лучше использоваться чтобы не удалить случайно другие файлы. Вы скорее всего генерируете имена бекап файлов по какому-то шаблону и знаете его. Например, в конце имени может стоять слово – bak или тп

Теперь, когда мы нашли все файлы подлежащие удалению – их необходимо удалить
Для этого не придётся пользоваться дополнительными утилитами, можно воспользоваться встроенной функцией утилиты find – опция -delete.
~ find /home/alex/mytest.dir/v22/test* -maxdepth 1 -type f -mtime +90 -delete
Теперь все найденные файлы будут удалены.
Проверяем:
~/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90
/home/alex/mytest.dir/v22/test-o.txt
/home/alex/mytest.dir/v22/test-q.txt
/home/alex/mytest.dir/v22/test-p.txt
/home/alex/mytest.dir/v22/test-s.txt
/home/alex/mytest.dir/v22/test-r.txt
/home/alex/mytest.dir/v22/test-t.txt
~/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 -delete
~/mytest.dir/v22$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90
~/mytest.dir/v22$ ls -lt
total 0
-rw-rw-r-- 1 alex alex 0 Feb 17 13:00 test-z.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-a.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-b.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-c.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-d.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-e.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-f.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-g.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-h.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-i.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-j.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-k.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-l.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-m.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:04 test-n.txt
-rw-rw-r-- 1 alex alex 0 Feb 17 11:00 test-y.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-v.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-w.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 13:07 test-x.txt
-rw-rw-r-- 1 alex alex 0 Feb 3 11:07 test-u.txt

Следующим шагом будет поставнока данной команды в cron – автоматизация данного процесса:
Запись в кроне пользователя mybackup (удаляются файлы для двух серверов в данном случае):
В моём случае это выглядит вот так:
mybackup@raspberrypi~ $ contab -e
#######################
#
# old backup files autoremove (one time per week):
0 22 * * 1 find /home/mybackup/*/*it-inside*.gz -maxdepth 1 -type f -mtime +30 -delete
#
#######################

Возможно вы захотите добавить дополнительное сохранение вашего бекапа – например, один бекап в месяц перемещать в спец директорию – в ней будут храниться бекапы в течение года. От туда вы будете удалять файлы, но один раз в месяц или пытаться удалить раз в неделю, но выставив пороговое значение создание файла в один год. Таким образом файлы будут удаляться один раз в месяц из этой дерктории или с определённым именем. Конкретные настройки зависят от вас.

Как это можно сделать?
Вот простейшая комбинация команд. Сейчас я покажу как можно из всех файлов за последний месяц выбрать один и скопировать кго в другую папку.
$ find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 | sort -r
$ set `find /home/alex/mytest.dir/v22 -maxdepth 1 -type f -mtime +90 | sort -r`
$ echo $1
/home/alex/mytest.dir/v22/test-t.txt

$ cp $1 $1-bak
$ ls -l | grep test-t.txt
-rw-rw-r-- 1 alex alex 0 Nov 17 13:06 test-t.txt
-rw-rw-r-- 1 alex alex 0 Feb 18 17:55 test-t.txt-bak

Как видите – всё достаточно просто.

На сегодня всё.
Удачи!

Sources and additional info:
How can I change the date modified/created of a file?

+
find /home/backup/test_*.txt -maxdepth 1 -type f -mtime +7 -delete

-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.

-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.