最常用稳妥的清理方式是用find配合-mtime +30,它匹配修改时间≤当前时间减31天零秒的文件,非简单日历倒推;推荐先预览再-delete删除,支持-type f、多后缀、-size等组合过滤,并可写入定时任务自动化执行。

直接用 find 配合 -mtime +30 是最常用、最稳妥的清理方式,适合大多数日志目录,比如 /var/log/、/opt/app/logs/ 这类结构清晰的路径。
理解 -mtime +30 的真实含义
-mtime +30 表示“修改时间在 30 天前(不含当天)的文件”,即文件最后修改时间 ≤ 当前时间减去 31 天零秒。它不是按日历天数简单倒推,而是基于文件的 mtime 时间戳与当前系统时间做比较。例如今天是 2026-05-01,那匹配的是所有 mtime ≤ 2026-03-31 23:59:59 的文件。
注意:-mtime +30 不等于“30天以上”,也不包含刚满30天的文件;若要包含恰好30天整的,应使用 -mtime +29。
基础清理命令写法
执行前建议先预览将被删除的文件,避免误删:
- 查看哪些 .log 文件会被清理:
find /var/log/myapp -name "*.log" -mtime +30 -ls - 真正删除(加
-delete):find /var/log/myapp -name "*.log" -mtime +30 -delete - 更安全的写法(兼容老版本 find,用
-exec):find /var/log/myapp -name "*.log" -mtime +30 -exec rm -f {} \;
推荐优先用 -delete,它比 -exec rm 效率更高,且原子性更好;但注意 -delete 要求路径必须是起始目录的子目录,不能跨挂载点。
增强实用性:多条件组合过滤
生产环境中日志往往混杂,需叠加判断:
- 只处理普通文件(排除目录或符号链接):
-type f - 同时清理 .log 和 .err:
-name "*.log" -o -name "*.err",记得用括号分组并加转义:\( -name "*.log" -o -name "*.err" \) - 限制大小,避免误删关键小日志(如只删大于1MB的旧日志):
-size +1M - 完整示例:
find /data/app/logs -type f \( -name "*.log" -o -name "*.err" \) -mtime +30 -size +1M -delete
纳入定时任务实现自动化
把清理逻辑固化为脚本,并交由 cron 每日执行:
- 新建脚本
/usr/local/bin/clean-old-logs.sh,内容为:#!/bin/bash<br>find /var/log/nginx -name "*.log" -mtime +30 -delete<br>find /var/log/tomcat -name "*.out" -mtime +30 -delete
- 赋予执行权限:
chmod +x /usr/local/bin/clean-old-logs.sh - 添加到 crontab(每天凌晨 2:15 执行):
15 2 * * * /usr/local/bin/clean-old-logs.sh >> /var/log/clean-logs.log 2>&1
加上日志重定向,方便后续排查是否真有文件被删、有无权限错误等。











