我有一个脚本,可以从备份目录中删除早于 X=21 天的数据库转储:
DB_DUMP_DIR=/var/backups/dbs
RETENTION=$((21*24*60)) # 3 weeks
find ${DB_DUMP_DIR} -type f -mmin +${RETENTION} -delete
但是,如果由于某种原因数据库转储作业暂时无法完成,则所有转储最终都将被丢弃。因此,作为保障措施,我希望至少保留最年轻的 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
(这个片段可能有小错误 - 忽略它们。这是为了说明我自己能想到什么,以及为什么我不喜欢它)
编辑:查找选项“-mtime”是一次性的:“-mtime +21”实际上意味着“至少 22 天”。这总是让我困惑,所以我使用 -mmin 代替。仍然是一次性的,但只有一分钟。
Use find
要获取所有足够旧的文件以删除,请过滤掉$KEEP
最年轻的与tail
,然后将其余的传递给xargs
.
find ${DB_DUMP_DIR} -type f -printf '%T@ %p\n' -mmin +$RETENTION |
sort -nr | tail -n +$KEEP |
xargs -r echo
Replace echo
with rm
如果报告的文件列表是您要删除的列表。
(我假设所有转储文件的名称中都没有换行符。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)