-mtime按24小时整数倍计算,如-mtime +7指修改时间≥8天前;-mmin按分钟精确计算,如-mmin +360即6小时前;生产中应优先用-mtime清理静态备份,配合-print预览再删除,避免误删。

find 命令中 -mtime 和 -mmin 的区别必须分清
-mtime 按“24 小时整数倍”计算,比如 -mtime +7 表示“修改时间早于 7×24 小时前”,即8 天或更早(不是“7 天前”)。实际生产中误用会导致删错或漏删。-mmin 更精确,按分钟计,适合需要小时级控制的备份清理(如保留最近 6 小时内的临时备份)。
-
-mtime +7→ 文件最后修改时间 ≤ 192 小时前(即 8 天零秒以前) -
-mmin +360→ 修改时间 ≤ 360 分钟前(即 6 小时前) - 不要用
-mtime 7试图找“恰好 7 天前”的文件——它匹配的是 7×24h ±12h 范围,不可靠 - 真要按具体日期筛选,改用
-newermt "2024-05-01"更稳妥
清理备份前务必先用 -print 或 -ls 验证匹配结果
直接加 -delete 是高危操作,尤其当路径含通配符或权限复杂时。应分两步:先看命中的文件是否符合预期,再执行删除。
- 先运行:
find /backup -name "*.tar.gz" -mtime +30 -print
- 若输出合理,再执行:
find /backup -name "*.tar.gz" -mtime +30 -delete
- 更安全的替代是
-exec rm -f {} \;,它对每个文件单独调用rm,避免-delete在某些旧版 find 中不支持或行为异常 - 注意:如果备份文件是硬链接(如 rsync 的增量快照),
-delete只删当前路径的引用,不影响其他链接——这点常被忽略
按修改时间(-mtime)还是状态变更时间(-ctime)?备份场景该选哪个
备份文件生成后通常不再修改内容,但可能被归档工具、权限同步脚本等触发元数据变更,导致 -ctime 比 -mtime 更新。清理策略应以“你希望保留多久的有效备份”为准:
- 用
-mtime:适用于 tar、rsync、mysqldump 等生成后基本不动的静态备份 - 用
-ctime:仅当你明确知道备份流程会频繁更新文件属性(如 chmod/chown 批量操作),且你想按“最后被系统处理的时间”清理 - 绝大多数备份清理应坚持用
-mtime,否则可能误判“新备份”为“旧文件”而提前清除
带路径和命名约束的实战写法(例如只删 /backup/mysql/ 下 90 天前的 .sql 文件)
真实环境里,备份目录结构杂、文件类型多,需组合多个条件避免误伤:
- 匹配并预览:
find /backup/mysql -maxdepth 1 -type f -name "*.sql" -mtime +90 -print
-
-maxdepth 1防止递归进子目录(如 /backup/mysql/2024-06/)误删其他周期备份 -
-type f排除目录、符号链接等干扰项(有些备份脚本会建空目录占位) - 多条件用
-a(默认隐含)连接,如需排除某类文件,用! -name "exclude_*" - 如果备份名含日期(如 backup20240501.sql),也可用
-regex替代-name,但注意 GNU find 的-regex默认匹配全路径,需写成.*mysql/backup[0-9]{8}.sql
真正容易出问题的不是语法,而是没确认好“这个备份到底算不算过期”——比如某次手动恢复后忘了重命名,导致它被当成旧备份删掉。建议在清理命令前加一行日志记录:echo "$(date): cleaning backups older than 90 days" >> /var/log/backup-cleanup.log











