最稳的起点是du -ah / 2>/dev/null | sort -hr | head -n 10,但统计的是磁盘占用量而非逻辑大小,含目录和重复计数;若只查文件,须用find -type f过滤,并推荐du -ab或find -printf '%s'避免locale导致排序错误。

du -ah / 2>/dev/null | sort -hr | head -n 10 是最直接可用的命令,但它默认统计的是磁盘占用量(含目录、硬链接重复计数、稀疏文件等),不是纯文件逻辑大小;若你真要“前10个最大文件”,得加 -type f 过滤,否则结果里混着目录很常见。
只查文件,别混进目录
用 du 直接查整个系统时,du -ah 默认会把目录也当“条目”输出——而一个大目录可能排第一,但你真正想删的是它里面的某个日志文件。
必须配合 find 先筛出纯文件:
-
find / -xdev -type f -exec du -h {} \; 2>/dev/null | sort -hr | head -n 10:带单位输出,易读但慢(每个文件都调一次du) -
find / -xdev -type f -printf '%s %p\n' 2>/dev/null | sort -nr | head -n 10 | awk '{print $2}':用字节数排序,快且准,%s是真实逻辑大小,-xdev防跨文件系统误入/proc或/mnt
sort -hr 在中文环境容易排错
很多终端 locale 设为 zh_CN.UTF-8 时,sort -hr 会把 1.5G 和 100M 按字符串比("100M" > "1.5G"),导致排序失效。
安全做法是统一转成字节再排:
- 用
du -ab(b表示字节)替代-h:du -ab / 2>/dev/null | sort -nr | head -n 10 - 或用
find -printf '%s',它天生输出整数,不依赖 locale
想快?别排序,直接按阈值筛
如果你只是怀疑“有没有超 1G 的文件”,根本不需要扫全盘再排序——find -size 是唯一不遍历内容、只读 inode 的方式,毫秒级返回:
-
find / -xdev -type f -size +1G 2>/dev/null:列出所有 >1GB 的文件,无排序、无延迟 -
find /var/log -type f -name "*.log" -size +500M:限定路径+后缀+大小,精准定位日志炸弹 - 注意:
+1G是大于 1GiB(1073741824 字节),不是 10⁹;单位支持c(字节)、k、M、G
交互式分析用 ncdu,但别指望管道
ncdu 真好用,能钻目录、看百分比、一键删,但它不是命令行工具——不能 | grep,也不能 head -n 10。它适合人工排查,不适合脚本或定时任务:
- 装完就跑:
ncdu /var,回车进子目录,d删除,q退出 - 生成快照供复盘:
ncdu -o ncdu-report.dat /var/log,之后用ncdu -f ncdu-report.dat重放 - 别写成
ncdu / | head -n 10——它根本不输出到 stdout
实际执行时最容易忽略两点:一是没加 -xdev 导致卡在 /mnt/nfs 或挂死的 NFS 挂载点;二是用 sort -hr 却忘了终端 locale,排出来的“最大10个”里有 3 个其实是 2MB 的小文件。


















