用find配合mtime和rm可安全清理日志,需先测试再执行:先用-print预览待删文件,确认无误后用-delete或xargs rm删除;脚本中应校验路径存在并加日志记录。

直接用 find 配合 mtime 和 rm 就能稳妥清理,关键是要先测试、再执行,避免误删。
确认日志路径和保留天数
业务日志通常存放在固定目录,比如 /var/log/myapp/ 或 /data/logs/。先明确两点:
- 日志文件命名是否统一(如
app.log、app.log.2024-05-01或带压缩后缀的.log.gz) - “超过30天”是指文件最后修改时间(
mtime),不是创建时间或日志内容里的日期
安全预演:先查再删
千万别一上来就加 rm。先运行下面命令,只列出将被删除的文件:
find /var/log/myapp -name "*.log*" -type f -mtime +30 -print
如果日志是按日期归档的(如 app.log.20240401),可加通配符匹配;若混有 .gz 文件,把 -name "*.log*" 改成 -name "*.log*" -o -name "*.gz"。
真正执行清理(加 -delete 或 xargs rm)
确认预演结果无误后,再执行删除。推荐两种写法:
- 用
-delete(简洁,但不支持复杂条件):find /var/log/myapp -name "*.log*" -type f -mtime +30 -delete - 用
xargs rm(更可控,适合加日志或做二次过滤):find /var/log/myapp -name "*.log*" -type f -mtime +30 -print0 | xargs -0 rm -f
注意:务必确保路径末尾没有多余斜杠(如 /var/log/myapp/ vs /var/log/myapp),否则可能匹配失败;-mtime +30 表示“修改时间大于30天”,即31天及以上。
封装成可定时执行的脚本
新建 clean_logs.sh,加上基础防护:
#!/bin/bash LOG_DIR="/var/log/myapp" DAYS=30 <p>if [ ! -d "$LOG_DIR" ]; then echo "警告:目录 $LOG_DIR 不存在" exit 1 fi</p><p>echo "正在清理 $LOG_DIR 下 $DAYS 天前的日志..." find "$LOG_DIR" -name "<em>.log</em>" -type f -mtime +"$DAYS" -print0 | xargs -0 rm -f echo "清理完成。"</p>
给执行权限:chmod +x clean_logs.sh,再加入 crontab 每天凌晨2点运行:0 2 * * * /path/to/clean_logs.sh >> /var/log/clean_logs.log 2>&1











