最安全高效的日志清理方式是用 find 配 -mtime +7 和 -delete,但必须先预览、加路径限制、排除保留文件;-mtime +7 表示修改时间超过 7×24 小时(即 8 天及更早),非字面“7 天前”。

直接说结论:用 find 配 -mtime +7 和 -delete 最安全高效,但必须先预览、加路径限制、排除保留文件,否则极易误删。
为什么 -mtime +7 不等于“7天前”
这是最常踩的坑:-mtime +7 表示“修改时间超过 7×24 小时”,即 8 天及更早的文件(比如今天是 7 月 8 日,它匹配的是 7 月 1 日 19:16 之前修改的文件)。不是字面意义的“7 天前(7 月 1 日)当天的文件”。
- 要精确到某一天(如只删 7 月 1 日当天的),得用
-newermt或结合touch生成时间边界文件 - 若想包含 7 天整(即 7 月 1 日 00:00–23:59),需用
-daystart -mtime +6,但多数场景用+7更稳妥 -
-mtime 7是指“正好在 [7×24h, 8×24h) 区间内修改”,范围窄且难命中,不推荐用于清理
find 删除前必须做的三件事
跳过这步直接跑 -delete,等于把 rm -rf 指向生产目录。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 先用
-ls预览:例如find /var/log -type f -name "*.log" -mtime +7 -ls,确认列出的全是目标日志,且路径无误 - 加
-maxdepth 1:避免递归进子目录误删重要配置或数据,比如find /backup -maxdepth 1 -type f -name "*.tar.gz" -mtime +7 -ls - 排除保留文件:用
! -name "latest.*"或! -name "current.log",防止删掉软链接或最新快照
-delete 比 -exec rm {} \; 强在哪
两者都能删,但 -delete 是 find 内置动作,不依赖 shell 解析,天然规避空格、换行、特殊字符导致的断裂问题。
-
-exec rm {} \;在文件名含空格时会失败(如/path/my backup.log被拆成两个参数) -
-delete自动处理路径转义,无需额外引号或xargs -0 - 但
-delete要求目标目录可写,且不能跨文件系统删除(遇到挂载点会报错) - 如果必须用
-exec(比如要加rm -v看每条输出),务必写成-exec rm -f {} +(末尾是+,非\;),批量执行更高效
放进 crontab 定时执行的注意事项
定时任务里写错一个斜杠,可能半夜删光整个 /var。
- 绝对路径必须写全:crontab 默认
$PATH很窄,find建议用/usr/bin/find - 重定向错误日志:加
2>&1 >> /var/log/clean-logs.log,否则失败无声无息 - 别用
*通配符在路径中:例如/home/*/logs在 cron 里不会展开,要用find /home -mindepth 2 -maxdepth 2 -path "*/logs" - 测试时先设为每分钟执行(
* * * * *),确认日志和效果后,再改成每天一次(0 2 * * *)
真正危险的从来不是命令本身,而是没验证路径、没限制深度、没排除 latest 文件——这些细节一漏,find 就从清洁工变成拆迁队。

















