c++ string的find/rfind函数易因误判npos和下标0而翻车,需严格用!=npos判断;其重载形式支持子串、字符、指定长度c风格字符串查找,rfind从末尾反向搜索。

直接用 find 配合 -mtime 是最稳妥、最常用的方式,但必须理解它的“24小时整倍数”语义,否则会删错或漏删。
为什么 find -mtime +N 容易误判日期
-mtime +7 不是“删除 4 月 3 日当天及更早的日志”,而是“删除最后修改时间在 7×24 小时之前(即 4 月 4 日 00:00 之前)的文件”。比如今天是 10 月 2 日 21:23,-mtime +7 实际匹配的是 9 月 24 日 21:23 之前修改的所有文件。
这意味着:
- 如果你在凌晨执行,和晚上执行,同一条命令可能差出整整一天的覆盖范围
- 日志按天切割(如
app.log.2026-09-25),但文件修改时间未必是当天零点,-mtime可能漏掉部分“逻辑上该删”的文件 - 不加
-type f可能误匹配目录,加了-delete会直接报错或跳过
安全清理命令写法(推荐带预览)
生产环境务必先用 -ok 或 -print 确认目标,再执行删除:
find /var/log -name "*.log*" -type f -mtime +15 -print
确认无误后,换成:
find /var/log -name "*.log*" -type f -mtime +15 -delete
关键参数说明:
-
/var/log:限定作用域,避免递归到/var/log/journal这类二进制目录(journalctl 管理,不能直接删) -
"*.log*":覆盖syslog、auth.log.1、nginx/access.log.2.gz等常见变体 -
-type f:强制只匹配普通文件,排除符号链接和目录 -
-delete:比-exec rm {} \;更高效,且原子性强(要求 find 版本 ≥4.2.3)
遇到被进程占用的日志文件怎么办
比如 /var/log/syslog 正被 rsyslog 写入,rm 会失败,find -delete 也会跳过。此时不能硬删,应清空内容:
truncate -s 0 /var/log/syslog
这个操作不会改变 inode,也不会中断写入,对服务完全透明。适用于:
- 当前活跃日志(如
app.log、catalina.out) - 磁盘已满急需释放空间,但又不能重启服务
- 你只想清空内容、保留文件结构供后续轮转
注意:truncate 不支持通配符,需配合 find -exec 使用(且要确保目标确实是打开状态的文件):
find /var/log -name "app.log" -type f -exec truncate -s 0 {} \;
真正需要长期运行时,别只靠 find
find 是“事后清扫”,适合临时救急或自定义路径;但系统级日志(/var/log/syslog、/var/log/auth.log)和主流服务(Nginx、Apache)应该交给 logrotate 管理——它会在轮转前自动通知服务 reopen 日志文件,避免丢失任何一行。
如果你发现 find 每次都要手动跑,说明轮转配置没生效或压根没配。检查:
-
ls /etc/logrotate.d/是否有对应服务配置 -
logrotate -d /etc/logrotate.conf是否报错(-d是调试模式) -
cat /etc/cron.daily/logrotate是否存在且可执行
最常被忽略的一点:logrotate 默认只处理 /var/log 下的文件,自定义路径(如 /home/app/logs)必须显式写进配置,否则 find 就是你唯一的指望。











