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

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


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

Как это правильно реализовать?
Всем спасибо.
  • Вопрос задан
  • 19534 просмотра
Пригласить эксперта
Ответы на вопрос 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
а можно такое же сделать, но на удаленном фтп, на который льются бекапы?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
03 мар. 2021, в 15:45
20000 руб./за проект
03 мар. 2021, в 15:42
2000 руб./за проект
03 мар. 2021, в 15:35
6000 руб./за проект