LINUX.ORG.RU

[bash] удаление старых бэкапов

 


0

1

Есть простой скрипт на bash делающий по Cron'у бэкап данных. Необходимо дописать скрипт чтобы он удалял архивы старше 7'и дней, но оставлял последний архив каждого месяца.

Удаление старых файлов сделал так:

 find /каталог_с_архивами/ -type f -mtime +7 | xargs /bin/rm -f 

Но вот как сделать чтобы при этом не удалялись последние архивы каждого месяца (может проще оставлять архивы за 1'е число каждого месяца).

Формат имени архивов такой:

2011.10.31.tar.bz2
2011.11.01.tar.bz2
2011.11.02.tar.bz2

Я в bash'е не силен :( Подскажите пож. как решить задачу.

★★

>2011.11.01.tar.bz2

хотите оставить? прямо в find перед type -f пишете

! -regex '[0-9]\{4\}\.[01][0-9]\.01\.tar\.bz'

и find не видит файлов от первого числа. Хотя имхо проще создавать архив вида 2011.11.last_backup.tar.bz2, и потом его копировать в 2011.11.01.tar.bz2, 2011.11.02.tar.bz2 и так далее. Тогда архив 2011.11.last_backup.tar.bz2 будет гарантированно последним, иначе вдруг 1го числа сервер не будет работать? Архив потеряется. Конечно last_backup тоже надо обходить find'ом.

drBatty ★★
()
Ответ на: комментарий от drBatty

Странно, я попробовал разобраться, но не получается.

! -regex '[0-9]\{4\}\.[01][0-9]\.01\.tar\.bz'

Не работает, но если, например, сделать так:

! -regex '[0-9][0-9][0-9][0-9]\.[01][0-9]\.01\.tar\.bz'

То все правильно.

static ★★
() автор топика

ls -t /каталог_с_архивами/ | tail -n +7 | xargs ...

DonkeyHot ★★★★★
()

-mtime +7

Это очень хреновый подход.

Например (user-story): бекапы перестали делаться (библиотека пропала, место кончилось, отмонтировали директорию...), тогда спустя какое-то время все бэкапы удаляться :-)

[br]
REMOVE_OLDEST ()[br]
{[br]
	mask=$1[br]
	MAX_FILES=${2:-14}[br]
	echo -en "REMOVE_OLDEST: ${mask} : "[br]
	files="$(ls -1t ${mask} || true)"[br]
	echo "${files}" | wc -l[br]
	if expr "$(echo "$files" | wc -l)" '>' "$MAX_FILES" &>/dev/null; then[br]
		to_remove=$(echo "$files" | tail -1)[br]
		echo "Removing ${to_remove}"[br]
		rm -f "${to_remove}"[br]
	fi[br]
}[br]
#...[br]
REMOVE_OLDEST "etc_tar/etc-*.tar.*"[br]
[[/code]][br]

anonymous
()
Ответ на: комментарий от former_anonymous

Спасибо всем большое за полезные советы. Заработало после добавления "-regextype posix-basic" :)

static ★★
() автор топика
Ответ на: комментарий от JFreeM

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

sin_a ★★★★★
()
Ответ на: комментарий от backbone

что только люди не делают, лишь бы rdiff-backup не юзать.

second optional fix

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.