【发布时间】:2013-12-19 23:10:19
【问题描述】:
我有一个脚本可以从备份目录中删除早于 X=21 天的数据库转储:
DB_DUMP_DIR=/var/backups/dbs
RETENTION=$((21*24*60)) # 3 weeks
find ${DB_DUMP_DIR} -type f -mmin +${RETENTION} -delete
但是,如果出于某种原因,DB 转储作业有一段时间未能完成,所有转储最终都会被丢弃。因此,作为保障,我希望至少保留最年轻的 Y=7 转储,即使它们全部或部分都超过 21 天。
我寻找比这意大利面更优雅的东西:
DB_DUMP_DIR=/var/backups/dbs
RETENTION=$((21*24*60)) # 3 weeks
KEEP=7
find ${DB_DUMP_DIR} -type f -printf '%T@ %p\n' | \ # list all dumps with epoch
sort -n | \ # sort by epoch, oldest 1st
head --lines=-${KEEP} |\ # Remove youngest/bottom 7 dumps
while read date filename ; do # loop through the rest
find $filename -mmin +${RETENTION} -delete # delete if older than 21 days
done
(这个 sn-p 可能有一些小错误 - 忽略它们。这是为了说明我自己能想出什么,以及为什么我不喜欢它)
编辑:查找选项“-mtime”是一次性的:“-mtime +21”实际上意味着“至少 22 天”。这总是让我感到困惑,所以我使用 -mmin 代替。还是一次性的,但只有一分钟。
【问题讨论】:
-
我投票结束这个问题,因为下面的答案似乎都不能正确回答这个问题。呈现的副本有一个完美的有效答案。
-
mtime 在几天内工作时更容易使用。 -mmin n 文件的数据最后一次修改是在 n 分钟前。 -mtime n 文件的数据最后一次修改是在 n*24 小时前
标签: bash shell command-line find