Собственный ротатор бэкапов

Часто ставится задача создания резервных копий (бэкапов) с сохранением последних, например, пяти копий.
Резервную копию директории можно создать при помощи архиватора. Чаще всего в *nix-системах используют сочетание tar+bzip2.
С ротацией дело обстоит несколько сложнее, но не так сложно, как может показаться.

Вот пример (файл etc_backup.sh):

#!/bin/bash

# Переменная для сохранения строки с датой
BACKUP_DATE=`date +%Y-%m-%d__%H:%M:%S`

# Префикс, или, говоря иначе, начало имени файла
BACKUP_PREFIX="etc"

# Количество копий, которое нужно сохранять
MAX_COPIES_COUNTER=5

# Директория, которая будет архивироваться
DIRECTORY_TO_BACKUP="/etc"

# Директория, в которой будут храниться бэкапы
DIRECTORY_FOR_BACKUPS="/backup/data"

# Собственно архивация
# При архивации сообщения об ошибках будут погашены
tar -cjf $DIRECTORY_FOR_BACKUPS/$BACKUP_PREFIX__$BACKUP_DATE.tar.bz2 $DIRECTORY_TO_BACKUP 2>/dev/null

# Подсчитываем количество копий, которое сохранено в папке для хранения резервных копий
COPIES_COUNTER=`ls /backup/data | grep $BACKUP_PREFIX | wc -l`

# Если файлов сохранено больше, чем нам необходимо
if [ $COPIES_COUNTER -gt $MAX_COPIES_COUNTER ]
then
# Вычисляем, сколько файлов нужно удалить из папки
NEED_TO_DELETE_COUNTER=$(($(ls /backup/data | wc -l)-$MAX_COPIES_COUNTER))
# Организуем цикл, количество циклов равно количеству файлов, которое нужно удалить
for (( i==1; i<$NEED_TO_DELETE_COUNTER; i++ ))
do
# Сортируем список файлов, берем из него первый и удаляем
# Файлы будут отсортированы по возрастанию, соответственно
# удалится самый ранний файл
rm $DIRECTORY_FOR_BACKUPS/$(ls $DIRECTORY_FOR_BACKUPS | sort | head -n 1)
done
fi

[wysija_form id="2"]