find定位大文件时,-size参数单位(k/m/g)和符号(+表示大于、无符号表示精确等于)必须严格正确,gnu find中m=1024×1024字节,alpine等环境不支持mb/gb后缀;安全写法需结合-type f、-xdev、-mtime等限制范围,并优先预览再执行删除。

用 find 定位大文件,但 size 单位和符号必须写对
find 是最直接的起点,但 -size 参数极易出错:
- +100M 表示「严格大于 100MB」,不是「大于等于」
- 100M(不加符号)是「精确等于 100MB」,几乎找不到匹配项
- M 在 GNU find 中默认指 1024×1024 字节,但 Alpine/BusyBox 等精简环境只认 k/M/G,不支持 MB 或 GB 后缀
安全写法示例:
- 查
/var/log下大于 200MB 的普通日志文件:find /var/log -type f -size +200M - 加
-xdev防跨分区(避免扫到/proc、Docker volume 等):find /home -xdev -type f -size +1G - 加
-mtime +7过滤旧文件,避开正在写入的日志:find /tmp -type f -size +50M -mtime +7 - 别用
find / -size +1G全盘扫——低内存 VPS 可能触发 OOM Killer
用 du + sort 找“目录级巨无霸”,别被 ls * 断掉
find 只看单个文件,但真正吃空间的往往是目录堆出来的(比如 /var/lib/docker/overlay2 或 /home/user/.cache)。直接 du -sh * 会因权限拒绝中断,或被符号链接带偏。
正确姿势:
- 限定深度、吞掉错误输出:
du -sh --max-depth=1 /var/* 2>/dev/null | sort -hr | head -10 -
sort -hr中的h必不可少——它识别1.2G、456M;没h就按字典序排,99M会排在100M前面 - 想查文件级占用?组合用:
find /var -type f -exec du -h {} + | sort -hr | head -20
删之前必须确认文件没被进程占用
直接rm -f 一个正在被 rsyslogd、tail -f 或 Java 应用写入的文件,磁盘空间不会释放——inode 还被进程持有着。
验证方法:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 查所有「已删未释放」文件:
lsof +L1 - 查具体路径被谁占着:
lsof /var/log/syslog.1(把路径换成你找到的大文件) - 真要清空而非删除?用
truncate -s 0 <file></file>,比> <file></file>更可靠(后者在某些 shell 权限下会失败)
删的时候别跳过预览和范围控制
-delete 看似方便,但有硬伤:不支持与 -maxdepth 共用(旧版 find 报错),也不能和 -ls 同时用。更危险的是,它不提供中间确认。
稳妥流程:
- 先预览:
find /tmp -type f -size +100M | head -n 5,检查路径是否合理 - 再执行(注意结尾空格和反斜杠):
find /tmp -type f -size +100M -exec rm -f {} \; - 要交互确认?换
-ok:find /tmp -type f -size +100M -ok rm -f {} \; - 删完记得
sync,尤其物理机或 RAID 卡上,否则df可能显示不准
真正容易被忽略的点是:活跃日志、容器 overlay2 层、已删除但仍在被打开的文件——它们不显眼,却常占几十 GB。盯着 df 和 lsof +L1 对着看,比盲目 find ... -delete 安全得多。










