清理老旧备份文件应“删得准”:先确认路径与命名规则,用find按-mtime安全筛选,加-maxdepth和排除逻辑防误删,再通过cron定时执行并记录日志。

清理超过保存期限的老旧备份文件,关键不是“删得快”,而是“删得准”——只动该删的,不动正在用的、最新的或带保留标记的。
确认备份位置和命名规则
先明确两点:文件存在哪(比如 /backup/db/ 或 /backup/webapp/),以及它们怎么命名(如 db_20261001.sql、app_20261005_1422.tar.gz)。命名含时间戳的,后续可配合 -name 精确过滤;统一后缀的(如 .tar.gz、.sql),就用扩展名锁定范围。别直接扫整个 / 或 /var,容易误伤。
用 find 按修改时间安全筛选
推荐以 -mtime 为时间基准(适用于备份生成后基本不再改动的场景):
- 预览要删哪些文件:运行 find /backup -type f -name "*.tar.gz" -mtime +7 -ls,看列表是否全是目标旧备份
- 真正删除:确认无误后执行 find /backup -type f -name "*.tar.gz" -mtime +7 -delete
- 注意:+7 表示“早于 7×24 小时前”,即第 8 天及更早的文件,不是字面“7 天前”
限制范围,加保护逻辑
生产环境建议加几道防护:
- 加 -maxdepth 1,防止递归进子目录误删(例如 find /backup -maxdepth 1 -type f ...)
- 排除保留文件,比如 ! -name "latest.*",避免把 latest.tar.gz 一起干掉
- 若需保留最近 N 个(而非按天数),改用时间排序+截断:find /backup -name "app_*.tar.gz" -printf '%T@ %p\n' | sort -n | head -n -5 | cut -d' ' -f2- | xargs -r rm
接入定时任务并留日志
把清理动作交给 cron,每天固定时间执行:
- 编辑定时任务:crontab -e
- 添加一行(例如每天凌晨 2:10 执行):10 2 * * * /opt/scripts/clean-backup.sh >> /var/log/clean-backup.log 2>&1
- 脚本里第一行写好解释性注释,第二行检查路径是否存在,第三行才执行 find,降低静默失败风险


















