必须用-print0和-0,因为Linux文件名可含空格、制表符、换行符,而默认xargs按空白字符分割,会导致文件名被错误切分;-print0用\0(唯一不会出现在文件名中的字符)分隔路径,-0让xargs据此解析,二者必须配对使用。

直接删 7 天前的 .log 文件,用 find /var/log -name "*.log" -mtime +7 -type f -print0 | xargs -0 rm 就行;但不加 -print0 和 -0,遇到带空格或换行的文件名大概率出错。
为什么必须用 -print0 和 -0
Linux 文件名允许含空格、制表符、换行符,而默认的 find | xargs 按空白字符切分参数,一个叫 error log 2026-09.log 的文件会被拆成三个“文件”: error、log、2026-09.log,rm 会报错或误删。
-
-print0让find用\0(空字符)分隔每个路径,这是唯一不会出现在合法文件名中的字符 -
-0告诉xargs按\0切分输入,而非空格或换行 - 不配对使用就等于没加——只写
-print0不加-0,xargs还是按空格切;只写-0不加-print0,find输出仍是换行分隔,xargs会把换行当分隔符,照样崩
-mtime +7 到底指哪天的文件
-mtime +7 表示“修改时间早于 7×24 小时之前”,即**严格大于 7 天**。它不是按日历天数算,而是从当前时刻倒推 168 小时。
- 今天是 2026-09-08 11:28,
-mtime +7匹配的是最后修改时间在 2026-09-01 11:28 之前 的文件 - 如果想按“自然日”清理(比如删掉 2026-09-01 00:00 之前的所有日志),得加
-daystart:find /var/log -name "*.log" -daystart -mtime +7 -type f -print0 | xargs -0 rm -
-mtime 7是指修改时间落在 [168h, 192h) 区间内的文件(即正好第 7 天内),极少用于清理场景
删之前先预览,别手滑
执行 rm 前,务必先确认找对了文件。用 ls -l 或 echo 替代 rm 看输出:
find /var/log -name "*.log" -mtime +7 -type f -print0 | xargs -0 ls -lh
- 加
-type f排除目录,避免rm报Is a directory错误 - 如果日志目录权限受限(如
/var/log/journal),普通用户会漏掉结果,需加sudo——但sudo find ... | xargs rm中只有find有 root 权限,xargs还是普通用户,删不了;正确写法是sudo sh -c 'find ... -print0 | xargs -0 rm'或直接用-delete(见下条)
更安全的替代方案:-delete 和 -exec rm {} \;
find 自带 -delete 动作,语义清晰、无需管道、自动处理空格,且原子性强:
find /var/log -name "*.log" -mtime +7 -type f -delete
-
-delete隐含-depth(深度优先),不会因父目录先删导致子项找不到 - 但它要求
-delete是最后一个动作,且不能和-print等并列(会报错),调试时不如xargs灵活 -
-exec rm {} \;也能处理空格({}自动转义),但每次匹配都启一个rm进程,大量小文件时比xargs慢;-exec rm {} +可批量传参,效果接近xargs,但可读性稍差
真正容易被忽略的是:无论用哪种方式,/var/log 下某些子目录(如 journal、audit)受 systemd 或 SELinux 保护,直接 rm 可能失败或触发审计日志;这类目录建议用对应服务的原生命令清理,比如 journalctl --vacuum-time=7d。


















