Skip to content

Instantly share code, notes, and snippets.

@kovalbogdan95
Last active November 12, 2018 16:47
Show Gist options
  • Save kovalbogdan95/8cd04b41e79e66e48585b2040590055c to your computer and use it in GitHub Desktop.
Save kovalbogdan95/8cd04b41e79e66e48585b2040590055c to your computer and use it in GitHub Desktop.
Backup rotation based on backups count (deleting oldest)
#!/bin/bash
# Переменная для сохранения строки с датой
BACKUP_DATE=`date +%Y-%m-%d__%H:%M:%S`
# Префикс, или, говоря иначе, начало имени файла
BACKUP_PREFIX="prod_db"
# Количество копий, которое нужно сохранять
MAX_COPIES_COUNTER=5
# Директория, которая будет архивироваться
DIRECTORY_TO_BACKUP="./bk"
# Директория, в которой будут храниться бэкапы
DIRECTORY_FOR_BACKUPS="./data"
# Собственно архивация
# При архивации сообщения об ошибках будут погашены
tar -cjf $DIRECTORY_FOR_BACKUPS/$(echo $BACKUP_PREFIX)__$BACKUP_DATE.tar.bz2 $DIRECTORY_TO_BACKUP 2>/dev/null
echo "Creating $(ls $DIRECTORY_FOR_BACKUPS | sort -r | head -n 1)"
# Подсчитываем количество копий, которое сохранено в папке для хранения резервных копий
COPIES_COUNTER=`ls $DIRECTORY_FOR_BACKUPS | grep $BACKUP_PREFIX | wc -l`
# Если файлов сохранено больше, чем нам необходимо
if [ $COPIES_COUNTER -gt $MAX_COPIES_COUNTER ]
then
# Вычисляем, сколько файлов нужно удалить из папки
NEED_TO_DELETE_COUNTER=$(($(ls $DIRECTORY_FOR_BACKUPS | wc -l)-$MAX_COPIES_COUNTER))
# Организуем цикл, количество циклов равно количеству файлов, которое нужно удалить
for (( i==1; i<$NEED_TO_DELETE_COUNTER; i++ ))
do
# Сортируем список файлов, берем из него первый и удаляем
# Файлы будут отсортированы по возрастанию, соответственно
# удалится самый ранний файл
echo "Deleting $(ls $DIRECTORY_FOR_BACKUPS | sort | head -n 1)"
rm $DIRECTORY_FOR_BACKUPS/$(ls $DIRECTORY_FOR_BACKUPS | sort | head -n 1)
done
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment