Я поддерживаю некоторые резервные копии, ежедневные задания cron и ищу реализацию более сложной системы устаревания старых архивов, используя только bash и обычные утилиты Unix / Linux (такие как GNU). date ).
Политика, которую я хочу реализовать, выглядит примерно так:
- Храните по одному на каждый месяц, навсегда
- Держите один раз в неделю в течение 13 недель (приблизительно 3 месяца)
- Удалите все иначе старше 14 дней
Сценарий, который я набросал, поддерживает этикак (жесткие) ссылки в . / ежемесячно и . / еженедельно (относительно $ BASEDIR ).
Это выглядит примерно так:
#!bash
TSTAMP="$(date +%s-%Y%m%d)"
BASEDIR=/backups
TODAYS="myapp-$TSTAMP.tar.gz"
# If today is 01:
[ "$(date +%d)" = "01" ] && {
ln "$BASEDIR/$TODAYS" ./monthly/
ln "$BASEDIR/backup-$TSTAMP.log" ./monthly
}
# If day of week is 01 (Sunday)
[ "$(date +%w)" = "0" ] && {
ln "$BASEDIR/$TODAYS" ./weekly
ln "$BASEDIR/backup-$TSTAMP.log" ./weekly
}
# Find log from 14 days ago (capture results of glob)
f=$(eval echo ./backup-*$(date -d "2 weeks ago" +%Y%m%d)*.log)
# ... but only one match (trim off everything past the space)
f=${f%%" "*}
# If such a file exists: remove all files not newer than it
# but only from .
[ -r "$f" ] && find . -maxdepth 1 -not -newer "$f" -type f \
| xargs rm
Но какой разумный способ проверить это для угловых случаев?Я вижу, что если резервное копирование / журнал не удалось запустить в определенный день (система не работала, когда cron должен был ее запустить) ... тогда глобус не сможет найти ни одного файла, поэтому [ -r "$f" ]
не удастсяи никакая обрезка не будет сделана.Это кажется достаточно безобидным (я получаю дополнительный день резервного копирования. Если кто-то испортит разрешения для резервных копий, то -r
может завершиться ошибкой, даже если есть соответствующий файл (но это большая проблема).
(Примечание: это только часть системы, которая подготавливает файл резервной копии локального приложения. Существует совершенно другая система, которая собирает их все в центральное хранилище).
Кажется, должен быть более элегантный способчтобы сделать все это, однако!
Существует ли утилита, подобная find
, которая принимает какие-то спецификации хранения и генерирует список файлов в дереве, которые не соответствуют спецификациям