最常用、安全且高效的方法是用 find 命令配合 -mtime 或 -ctime 选项,务必先预览再执行删除;例如 find /var/log -type f -name "*.log" -mtime +30 -ls 预览,确认无误后加 -delete 或用 -print0 | xargs -0 rm -f 删除。

Linux 中查找并删除超过指定天数的旧日志,最常用、安全且高效的方法是使用 find 命令配合 -mtime(按修改时间)或 -ctime(按状态变更时间)选项。关键是要先确认日志路径、时间范围,并**务必先预览再执行删除**,避免误删。
确认日志存放位置和命名规律
常见日志路径包括:
/var/log/(系统日志主目录)
/var/log/nginx/、/var/log/apache2/(Web 服务日志)
/opt/app/logs/(自定义应用日志)
建议先用 ls -lt 查看最新文件排序,确认日志是否以 .log、.log.gz 或带日期后缀(如 app-20240101.log)方式命名。
用 find 预览符合条件的日志文件
例如:查找 /var/log/ 下修改时间超过 30 天的普通日志文件(不包含目录和压缩包):
find /var/log -type f -name "*.log" -mtime +30
说明:-type f:只匹配普通文件-name "*.log":匹配以 .log 结尾的文件(可按需改为 "*.log.gz" 或去掉)-mtime +30:表示“最后修改时间早于 30 天前”,即超过 30 天(注意:不是“30 天及以上”)
⚠️ 注意:-mtime +30 等价于“31 天前及更早”,-mtime 30 是“恰好 30 天前(±24 小时)”
安全删除:先测试,再加 -delete 或用 xargs
推荐两种稳妥方式:
-
方式一(推荐):用 -delete(简洁,但要求 find 版本较新)
先确认预览结果无误后,追加-delete:find /var/log -type f -name "*.log" -mtime +30 -delete
-
方式二:用 -print0 + xargs(兼容性更好,适合含空格路径)
find /var/log -type f -name "*.log" -mtime +30 -print0 | xargs -0 rm -f
? 提示:删除前可加 -ls 替代 -delete 查看详细信息(权限、大小、时间等),进一步验证:
find /var/log -type f -name "*.log" -mtime +30 -ls
进阶:按访问时间或处理压缩日志
如果日志被轮转后压缩归档(如 syslog.1.gz、messages-20240101),可扩展匹配:
- 同时清理 .log 和 .gz 文件:
-name "*.log" -o -name "*.gz" - 按最后访问时间(适合长期未读取的日志):
-atime +30 - 限制搜索深度(避免递归太深):
-maxdepth 2 - 排除特定子目录(如保留当前 nginx 日志):
-path "/var/log/nginx/current" -prune -o ...
实际组合示例(删除 /var/log 下除 nginx/ 目录外、30 天前的所有 .log 和 .gz 文件):
find /var/log \( -path "/var/log/nginx" -prune \) -o \( -type f \( -name "*.log" -o -name "*.gz" \) -mtime +30 -print -delete \)
不复杂但容易忽略的是:日志可能被 logrotate 管理,直接删文件可能导致轮转异常;若服务持续写入,建议优先配置 /etc/logrotate.conf 或对应配置文件,让系统自动归档与清理。











