最常用、最可控的日志清理方式是用 find 按修改时间筛选后删除,关键在“删得准”:先确认路径、后缀和时间逻辑,再执行;需预览(-print)、再删除(-delete),并注意 oracle 等需 rman 同步清理。

直接用 find 按修改时间筛选 + 删除,是最常用、最可控的方式。关键不是“删得快”,而是“删得准”——先确认路径、后缀和时间逻辑,再执行,避免误删生产日志。
明确归档日志存放位置和命名特征
应用或数据库的归档日志通常有固定路径和规律命名:
- 常见路径:
/var/log/appname/archive/、/opt/app/logs/backup/、$ORACLE_BASE/fast_recovery_area/xxx/archivelog/ - 典型后缀:
.log.gz、.tar.gz、.zip、.dbf(Oracle)、或带日期的纯文本如app-20240501.log - 建议先手动检查:
ls -lt /path/to/archive/ | head -5,确认文件修改时间是否符合预期
用 find 预览待删文件(务必先做)
运行以下命令,只列出匹配项,不删除:
find /var/log/appname/archive/ -type f \( -name "*.log.gz" -o -name "*.tar.gz" -o -name "*.zip" \) -mtime +30 -print
-
-mtime +30表示“最后修改时间超过 30 天”(即 30×24 小时前),不是日历月 -
-type f排除目录、软链接等非普通文件 - 括号
\( ... \)和-o用于多后缀逻辑或,注意反斜杠转义 - 若文件名含空格或特殊字符,可用
-print0替代-print,为后续安全处理铺路
安全执行批量删除
确认预览无误后,把 -print 换成 -delete:
find /var/log/appname/archive/ -type f \( -name "*.log.gz" -o -name "*.tar.gz" -o -name "*.zip" \) -mtime +30 -delete
-
-delete是 find 内置动作,比-exec rm {} \;更高效、更原子(不会因中断导致部分删除) - 若提示 “Argument list too long”,说明匹配文件过多,改用:
find ... -print0 | xargs -0 rm - Oracle 等数据库场景下,手工删完需同步更新控制文件:
rman target / > crosscheck archivelog all; delete expired archivelog all;
补充:按访问时间或状态变更时间筛选
多数情况下 -mtime 足够;但若归档后不再被读取,可考虑:
-
-atime +30:最后访问时间超 30 天(适合定期扫描后未打开的归档) -
-ctime +30:状态变更时间(如权限/属主改动),一般不用于日志清理 - Linux 不支持精确创建时间(birth time),不要依赖
-crtime类参数











