我维护一些备份,每天的 cron 作业,并且我正在寻求实现一个更复杂的系统,只使用bash和常见的 Unix/Linux 实用程序(例如GNU date)来老化旧档案。
我要实施的政策是这样的:
- 每个月留一个,永远
- 每周保持 1 次,持续 13 周(约 3 个月)
- 删除超过 14 天的所有其他内容
我草拟的脚本将这些作为(硬)链接维护在./monthly和./weekly 中(相对于$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 应该运行时已关闭)......那么 glob 将无法匹配任何文件,因此[ -r "$f" ]
将失败并且没有修剪将会完成。这似乎无害(我得到了额外的一天备份。如果有人弄乱了备份的权限,那么-r
即使存在匹配的文件也可能失败(但这是一个更大的问题)。
(注意:这只是准备本地应用程序备份文件的系统的一部分。有一个完全不同的系统将它们全部收集在中央存储上)。
不过,似乎应该有一种更优雅的方式来完成这一切!
是否有find
类似的实用程序采用某种保留规范并在树中生成与规范不匹配的文件列表?