如何保留最新8个备份文件并删除旧文件 解决logrotate不生效问题
如何保留最新的8个备份文件并删除更早的旧文件
现有备份文件均为.zip后缀,命名格式如下:
backup-Y-M-D.zip backup-Y-M-D.zip backup-Y-M-D.zip backup-Y-M-D.zip . . backup-Y-M-D.zip
需求为按文件创建/修改日期排序,仅保留最新的8个文件,删除其余旧备份。
原logrotate配置失效原因
之前使用的logrotate配置未生效,核心原因有三点:
- logrotate的原生设计是轮转由它自己管理生成的文件,不会主动识别其他脚本/手动生成的、命名不符合其轮转规则的存量备份文件,默认只会处理未被它添加过轮转序号后缀的目标文件,直接放入
backup-Y-M-D.zip格式的文件无法被识别为待轮转的历史备份。 - 配置中
rotate 4参数仅设置保留4份备份,和需要保留8份的需求不匹配。 - 配置中
daily规则要求两次运行间隔满24小时才会触发轮转,未到间隔时手动运行也不会执行操作。
实现方案
方案1:Shell命令清理(推荐,稳定无兼容问题)
直接通过系统命令按时间排序筛选文件执行清理,逻辑透明可控,适合备份清理场景:
- 先进入备份文件所在目录,执行预览命令确认待删除文件列表,避免误删:
cd /root/test ls -t *.zip | tail -n +9
- 确认输出的待删除文件列表无误后,执行删除操作:
ls -t *.zip | tail -n +9 | xargs rm -f
参数说明:
ls -t:将目录下的zip文件按最后修改时间从新到旧排序tail -n +9:从列表第9个文件开始截取,也就是跳过前8个最新的文件,剩余的就是需要删除的旧备份- 如果需要定时自动清理,直接将命令写入crontab即可,比如设置每天凌晨2点自动执行清理:
0 2 * * * cd /root/test && ls -t *.zip | tail -n +9 | xargs rm -f
方案2:修正logrotate配置(如需沿用logrotate)
如果必须使用logrotate实现需求,可按如下方式修改配置:
/root/test/*.zip { daily missingok rotate 8 nocompress olddir /root/test ifempty }
配置注意事项:
- 将
rotate参数值改为8,匹配保留8份最新备份的需求 - 删除原配置中的
extension .zip项,该配置会干扰自定义命名文件的轮转识别 - 首次运行时需要加
-f参数强制触发轮转,否则会因未满足24小时间隔要求不执行操作,执行命令为logrotate -f 你的配置文件路径 - logrotate默认按文件修改时间判断新旧,和按创建日期排序的需求基本一致,若手动修改过文件mtime可能出现排序偏差。
内容的提问来源于stack exchange,提问作者Siddharth Jain
相关产品推荐
相关产品推荐

