Как правильно удалять ненужные бэкапы?

Доброе утро всезнающий All.
Есть сервер на Linux Debian.
Делается бэкап. структура папок такова:
BACKUP_DIR="${BACKUP_ROOTDIR}/mysql/${YEAR}/${MONTH}/${DAY}"


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

Как это правильно реализовать?
Всем спасибо.
  • Вопрос задан
  • 17889 просмотров
Пригласить эксперта
Ответы на вопрос 11
Alukardd
@Alukardd
Если тупо старше какого-то срока, то по cron'у пускаем нечто такое:
find ${BACKUP_ROOTDIR} -type f -mtime +30 -delete

Удалит все файл старше 30дней.
Ответ написан
descentspb
@descentspb
У меня есть python-скрипт rotater.py, который я когда-то написал специально для этих целей, и он служит верой и правдой и по сей день.

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

Надеюсь, пригодится.
Ответ написан
@bugman
Получить список файлов — ls, find
Отсортировать их — sort
Взять все строчки кроме последних N — head, tail
Сформировать команду на удаление — sed, xargs
Ответ написан
Alukardd
@Alukardd
Как и обещал накидал небольшой скрипт...
#!/bin/bash

##################################
path=/tmp/testdir/2012
age=20
lcount=5
##################################

old="/tmp/oldest"
new="/tmp/newest"

find $path -type f -mtime +$age -printf '%T@ %p\n' | sort -n > $old
find $path -type f -mtime -$age > $new

count=$(wc -l $new | cut -d ' ' -f 1)
countold=$(wc -l $old | cut -d ' ' -f 1)
if [[ $countold -ne 0 ]]; then
	if [[ $count -gt $lcount ]]; then
		while read line; do
			rm -rf $line
		done <<< $(cat $old | cut -d ' ' -f 2)
	else
		let need=$lcount-$count
		if [[ $countold -lt $need ]]; then
			need=$countold
		fi
		if [[ $need -le 0 ]]; then
			echo qq
			exit 1
		fi
		tail -n $need $old >> $new
		sed -i 1,${need}d $old
		while read line; do
			rm -rf $line
		done <<< $(cat $old | cut -d ' ' -f 2)
	fi
fi

rm -f $new $old
Суть такова, что все что по дате подходит он оставит, хоть там будет 200 бэкапов. Если того что по дате подходит меньше $lcount (я для примера 5 написал), то он возьмёт не хватающие из тех что старше указанной даты (должен взять наиболее близкие по дате к нужной, если я тут ошибся то поменять не сложно — там tail либо head, список уже отсортирован).
Отделенные параметры можно принимать в виде аргументов, я не стал заморачиваться.
Ответ написан
bliznezz
@bliznezz
Ну вот набыдлокодил немного:
нагенерил примерно подходящих каталогов
for YEAR in {2010..2012} ; do for MONTH in `seq -w 1 12`; do for DAY in `seq -w 1 31` ; do mkdir -p ${YEAR}/${MONTH}/${DAY} ; done ; done ; done 

# определяем дату, позже которой надо удалять
TOO_OLD=`date +"%Y/%m/%d" --date="2 month ago"`
cd ${BACKUP_ROOTDIR}/mysql || exit 1 # на всякий случай, а то выполнив скрипт не там, похерим что-то нужное.
for SOMEDAY in `ls -d */*/*`
do
 [[ "$TOO_OLD" > "$SOMEDAY" ]]  && echo rm -rf $SOMEDAY
done


Конструкция [[ "$var1" > "$var2" ]] сравнивает строки «кто больше» по ASCII, но работает в баше, и не гарантируется такое же действие в других шеллах.
Ответ написан
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
У меня в публикации про обработку архивов видеонаблюдения средствами shell есть пачка скриптов, можете еще там посмотреть, как сделано, у меня так чистятся архивы записей с камер.
Ответ написан
@smartlight Автор вопроса
Спасибо всем отписавшимся.
Интересный вариант про кол-во файлов — как он реализуется?
Ответ написан
sledopit
@sledopit
Какая классная структура директорий. Можно раз в месяц грохать директорию за позапрошлый месяц. Тогда можно считать, что нужно грохать только одну директорию с месяцем за раз, а её определить совсем не сложно:
[ $(date +%m) -gt 2 ] && \
echo rm -r "${BACKUP_ROOTDIR}/mysql/$(date +%Y)/$(( $(date +%m) - 2 ))/"  || \
echo rm -r "${BACKUP_ROOTDIR}/mysql/$(( $(date +%Y) - 1 ))/$(( $(date +%m) ++ 10 ))/"
Ответ написан
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
У меня в публикациях есть статья по обработке видео архивов, один из скриптов как раз делает то, что Вам надо.
Буду рад, если пригодится
Ответ написан
@Barmunk
а можно такое же сделать, но на удаленном фтп, на который льются бекапы?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы