必须加 -type f 限定常规文件,否则会误报目录、设备节点等虚拟文件;必须加 -xdev 防跨挂载点;单位严格为 M(MiB),大小写敏感;需用 sort 排序才能识别真正大文件。

必须加 -type f,否则结果全是“假大文件”
直接跑 find / -size +100M 会把目录、设备节点、/proc/kcore 这类虚拟文件都算进去——它们的“大小”字段根本不是磁盘占用,而是元数据块数或内核伪造值。你看到一堆几百 GB 的“文件”,其实一个字节都没占真实磁盘。
真正要找吃空间的普通文件,必须限定类型:
-
-type f:只匹配常规文件,跳过目录、符号链接、socket、设备等 - 漏掉它,
find就是在猜,不是在查
-xdev 不是可选项,是防翻车底线
不加 -xdev,find 会钻进 /proc、/sys、/dev,甚至挂载的 NFS 或 Docker overlay 分区。轻则刷屏报 Permission denied,重则卡死、触发 OOM Killer(尤其在 2GB 内存的 VPS 上)。
加了 -xdev 才保证只查当前根文件系统,不跨挂载点:
find / -xdev -type f -size +100M 2>/dev/null- 如果只想查
/var,就写find /var -xdev -type f -size +100M -
/boot、/mnt、/media这些独立挂载点,天然被跳过
单位写错 = 查不到,+100M 不等于 +100MB
find 的 -size 单位严格区分大小写和含义:M 是 MiB(1024×1024 字节),MB 完全不识别;+100M 表示“严格大于 100 MiB”,不是 ≥100 MB。
常见错误写法及后果:
-
+100MB→ 命令报错或静默失败 -
+100m(小写)→ 被当成100 × 512 字节块,实际是 50KB,远小于预期 -
100M(无符号)→ 只匹配“刚好 100 MiB”的文件,几乎找不到
稳妥做法:想覆盖 ≥100 MiB 的文件,用 +99M;要查 ≥1 GiB,用 +1023M 或直接 +1G。
光列出路径没用,得排序才知道谁最大
find 只过滤,不排序。输出几十行路径,根本分不清哪个是真·巨无霸。必须接管道做二次处理:
- 快速看前 10 个最大文件(含大小、权限、时间):
find /var -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -hr -k5 | head -n 10
其中-k5指ls -lh输出的第 5 列(人类可读大小) - 更轻量的替代(不调用
ls多次):find /var -xdev -type f -size +100M -printf '%s %p\n' 2>/dev/null | sort -nr | head -n 10 | awk '{print $2}'-printf直接输出字节数+路径,避免 fork 开销,但部分嵌入式系统不支持
别急着 -delete。先用 -print 或 -ls 确认路径,尤其是 /var/log/journal/、/var/lib/docker/ 下的文件——删错一个,服务可能直接起不来。


















