查大文件首选find,必须加-type f和-xdev,否则会混入目录、符号链接及/proc等虚拟文件;+500m表示严格大于500mib,单位区分大小写,b非法;真正占空间最多的文件需配合du -h | sort -hr定位。

用 find 查找大于指定大小的文件,最常用也最容易出错
直接上结论:查大文件首选 find,但必须加 -type f 和 -xdev,否则结果里混进目录、符号链接、/proc 下的虚拟文件,甚至报一堆 No such file or directory 错误。
常见错误现象是执行 sudo find / -size +100M 后卡住、输出大量报错、或返回一堆不是“文件”的东西(比如目录路径)。这是因为:
-
find默认匹配所有类型节点,-size对目录也生效——但目录的“大小”是其元数据占用的块数,不是实际磁盘占用,毫无参考价值 - 不加
-xdev会跨挂载点搜索(比如 /mnt/nas、/boot、/home 单独分区),可能权限不足、设备未就绪,导致中断或假阳性 - 不加
-type f就会把/proc/kcore这类虚拟文件也算进去,它显示几百 GB,但根本不存在于磁盘上
正确写法示例(查找根目录下所有真实、本地、大于 500MB 的普通文件):
sudo find / -xdev -type f -size +500M -print
-size 参数单位和符号含义必须记牢,别靠猜
-size 后面的值不是字节,也不是十进制 MB,而是带单位后缀的整数,且 +/- 符号位置决定比较逻辑——这点很多人看一次忘一次。
-
+500M:严格大于 500 MiB(即 500 × 1024 × 1024 字节),不是 “≥500MB” -
-500M:严格小于 500 MiB(注意不是 “≤”,是纯小于) -
500M:**精确等于** 500 MiB(极少用,因文件系统对齐、压缩等因素几乎不可能完全吻合) - 单位区分大小写:
M是 MiB(1024²),G是 GiB(1024³),k是 KiB;c表示字节(如+1048576c≈ 1MB),b是 512 字节块(默认单位,慎用)
别用 100MB 这种写法——B 不是合法后缀,find 会静默忽略单位,变成按块(512B)计算,结果偏差百倍。
查“占空间最多”的文件,光靠 find 不够,得配 du 和 sort
如果目标不是“超过某个阈值”,而是“找出真正吃掉磁盘最多的那几个文件”,find -size 会漏掉很多情况:硬链接共享 inode、稀疏文件、加密容器内部结构等。此时更可靠的是用 du 统计实际磁盘占用,再排序。
-
du -h --max-depth=1 /var/log | sort -hr | head -20:列出 /var/log 下各子项(含文件)真实磁盘占用,倒序取前 20 -
find /home -xdev -type f -print0 | xargs -0 du -h | sort -hr | head -10:先找所有文件,再逐个统计,避免du对目录递归展开干扰排序 - 注意
du默认统计的是“磁盘块占用”,不是文件逻辑大小(ls -l显示的 Size),对日志轮转、数据库文件、VM 镜像这类场景更真实
权限和性能问题不能硬扛,要主动规避
在 / 下执行 find 很容易被权限拒绝(如 /root、/proc/*/fd)、被大目录拖慢(如 /var/lib/docker)、或触发内核保护(如访问 /sys/kernel/debug)。这不是命令写错了,是没做前置约束。
- 加
2>/dev/null屏蔽报错输出,但别关太死——关键错误如 “Permission denied” 被吞掉后你根本不知道漏了哪些路径 - 用
-maxdepth 2限制深度,比如只查 /home 下一级用户目录,跳过深层日志或缓存树 - 排除高频干扰路径:
sudo find / -xdev -type f -path '/proc' -prune -o -path '/sys' -prune -o -path '/dev' -prune -o -size +1G -print - 如果只是排查磁盘满,优先查已知高危区:
/var/log、/tmp、/home/*/.cache、/var/lib/docker/overlay2,比全盘扫快得多也准得多
真正麻烦的永远不是语法,而是 /proc/kcore 这种假大空文件、硬链接重复计数、以及你没意识到某些挂载点根本不该被扫——这些细节不处理,命令再“对”也没用。











