用于保留过去 3 天、过去 3 周和过去 3 个月备份的 Shell 脚本

用于保留过去 3 天、过去 3 周和过去 3 个月备份的 Shell 脚本

由于我缺乏 shell 知识,所以我不完全清楚如何做到这一点。

NOW=$(date +"%Y.%m.%d.%T")

tar czf /backups/web_backup_$NOW.tgz /web/

您能否帮助我删除旧备份以便仅保留:

  1. 过去 3 天
  2. 过去 3 周各备份一次
  3. 过去 3 个月各备份一次

答案1

像这样:(只是一个想法)

mkdir -p monthly
mkdir -p weekly

ln backup_$NOW.tgz weekly/

# find current month
month=$(date +%Y-%m-)
# find the first file of the current month in the weekly folder
first_monthly=$(ls --sort=time -1 weekly/*$month* 2>/dev/null | tail -1)
# and put it in the monthly folder
ln -f $first_monthly monthly/

# we need only 5 weekly backups
ls --sort=time -1 weekly/* 2>/dev/null | tail -n+6 >> /tmp/deletebackups.txt
# we need only 5 monthly backups
ls --sort=time -1 monthly/* 2>/dev/null | tail -n+6 >> /tmp/deletebackups.txt

# delete the extra files
#rm $(cat /tmp/deletebackups.txt) 2>/dev/null
xargs --arg-file /tmp/deletebackups.txt rm

答案2

看看 rsnapshot。它可能会立即满足您的要求。

答案3

如果您首先使用 rsnapshot,它会动态执行适当的备份保留(它会为您创建每小时、每天、每周...快照的结构)。

如果你没有使用 rsnapshot 创建快照,或者已经拥有相当多的快照,并且想事后精简它,那么请查看时间间隔。它正是针对此用例(备份保留策略的简单实现)而设计的。根据您的用例,您可以像这样调用时间间隔:

$ timegaps days3,weeks3,months3 *.tgz

然后,它会识别需要拒绝的 tgz 文件(基于文件修改时间),并将其写入 stdout 以供审查或进一步处理(非侵入式只读模式)。Timegaps 还可以处理--move这些文件或直接处理 --delete它们。如果需要,它可以从文件名中解析项目创建时间(查看帮助消息),而不是通过 检索它stat()

免责声明:我是 timegaps 的作者。

相关内容