<p>用 du -shx * | sort -rh 可快速定位当前目录下最大的子目录,-x 防跨文件系统误统计,--exclude 可跳过 node_modules 等无关注录,比 find 或 ls 更准确高效。</p>

直接用 du -sh * 配合 sort -rh 就能快速定位当前目录下最大的几个文件夹,不需要额外工具或脚本。
只看当前目录一级子目录的大小
这是最常用也最容易被忽略的起点。默认 du 会递归进所有子目录,输出行数爆炸,根本没法扫一眼看出谁最大。
-
du -sh *—— 显示当前目录下每个直接子项(文件或文件夹)的总大小,-h让单位可读,-s表示“只汇总自身”,不展开内部 - 加
| sort -rh后,按人类可读大小倒序排,最大的在最上面:du -sh * | sort -rh - 如果想限制只看前 5 个:
du -sh * | sort -rh | head -n 5 - 注意:
*不匹配以.开头的隐藏目录,要包含它们得显式写*/ .*/或用du -sh .[!.]* *
避免 du 统计时跨文件系统
当你对根目录或挂载点较多的路径(比如 /home)运行 du,它可能误把其他挂载分区(如 /boot、/var/log 单独挂载的 ext4 分区)也算进来,导致结果失真甚至卡住。
- 加
-x参数强制只统计同一文件系统内的内容:du -shx * | sort -rh - 这个选项特别关键——否则你看到的“最大目录”可能是另一个挂载点的根,而你根本无权清理它
-
df先确认哪些路径是独立挂载点:df -hT /home /var /boot
跳过特定目录加速统计
有些目录(如 .git、node_modules、__pycache__)体积大但无需关注,硬等 du 扫完很浪费时间。
- 用
--exclude跳过:du -shx --exclude="node_modules" --exclude=".git" * | sort -rh - 支持通配符:
--exclude="*.log"、--exclude="/proc"(不过/proc本身是虚拟文件系统,du默认会跳过,加了也无害) - 注意:路径必须和
du实际遍历时的相对路径一致;如果从/开始查,--exclude="home/user/.cache"才有效,而不是--exclude=".cache"
为什么不用 find + ls 或单纯 ls -lSh?
因为它们只看单层文件,不反映目录整体占用。一个空目录 + 一堆小文件,ls -lSh 可能排第一,但实际磁盘开销远不如一个含 2GB 日志的 logs/ 目录。
-
ls -lSh /path排的是每个条目的“元数据大小”或单个文件大小,不是该目录下所有内容总和 -
find /path -type d -exec du -sh {} \; | sort -rh看似可行,但每调用一次du都要重新扫描子树,性能极差,尤其对深目录 -
du -sh是唯一原生命令,一次性递归计算并缓存中间结果,效率高且语义准确
真正容易被忽略的是 -x 和 --exclude 的组合使用——不加 -x,结果可能跨分区不可信;不加 --exclude,du 可能卡在 /var/lib/docker 或 /home/user/.local/share/Trash 里半天没反应。


















