我维护一些备份,日常cron作业,并且我希望仅使用 bash 和常见的Unix / Linux实用程序(例如 GNU date )。
我要实施的政策类似于:
我草绘的脚本在 ./ 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
的实用程序,该实用程序需要某种保留规范并在树中生成与规范不符的文件列表?