Какой разумный способ сделать старение / сохранение файлов в оболочке (bash)? - PullRequest
0 голосов
/ 11 мая 2019

Я поддерживаю некоторые резервные копии, ежедневные задания 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, которая принимает какие-то спецификации хранения и генерирует список файлов в дереве, которые не соответствуют спецификациям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...