在shell(bash)中进行文件老化/保留的明智方法是什么?

时间:2019-05-11 00:35:23

标签: bash date backups

我维护一些备份,日常cron作业,并且我希望仅使用 bash 和常见的Unix / Linux实用程序(例如 GNU date )。

我要实施的政策类似于:

  • 每月永久保存一次
  • 每周保持一次,持续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的实用程序,该实用程序需要某种保留规范并在树中生成与规范不符的文件列表?

0 个答案:

没有答案