CLI AI

哪个文件夹在吃掉磁盘空间?用 du 按大小排序

2026-05-22

du -h --max-depth=1 . | sort -rh 会给你目录树的一层,最大的排在最前面。然后你在最大的那一项里重复同样的操作,直到找到罪魁祸首。这种逐层深入——而不是某个巧妙的命令——才是关键技巧。

1. 一层深度,最大的在前

clai
$ clai 显示这里的文件夹大小,深入一层,最大的排在前面→ du -h --max-depth=1 . | sort -rh348K	.296K	./a52K	./c

sort -rh 能正确排序人类可读的大小——它知道 2G 比 900M 大,而普通的 sort -r 并不知道这一点。

2. 去大小所在的地方

clai
$ clai 现在在最大的文件夹里做同样的事情→ du -h --max-depth=1 ./a | sort -rh

通常两三次这样的迭代就能找到答案。它比全树扫描更快,因为你根本不用去读那些不重要的分支。

3. 不要把其他文件系统算进去

clai
$ clai 统计 / 的总大小,但只留在这个文件系统内→ du -shx /348G	/

-x 让 du 不会深入到其他挂载点。没有它,对 / 的扫描会跑进 /mnt、网络共享和绑定挂载,得到的数字和你想清理的磁盘毫无关系。

4. 最大的单个文件

clai
$ clai 找出 /var 下最大的 10 个文件→ sudo find /var -xdev -type f -printf '%s\t%p\n' | sort -rn | head -10

有时候问题不是某个文件夹,而是一个 40 GB 的日志文件。-xdev 就是 find 里对应 du -x 的选项。

5. 交互式浏览

clai
$ clai 交互式浏览 /var 下的磁盘使用情况→ ncdu -x /var

ncdu 只扫描一次,然后你可以用方向键在目录树里走动,边看边删。如果你要运行 du 超过两次,不如直接装它。

6. 在能读取一切的权限下运行

clai
$ clai 扫描 / 的文件夹大小,不要权限报错的噪音→ sudo du -h --max-depth=1 -x / 2>/dev/null | sort -rh | head

没有 sudo,du 会悄悄跳过它进不去的目录,导致结果偏低。加上 sudo 后,2>/dev/null 会隐藏扫描过程中文件消失产生的噪音。

常见坑

  • du 统计的是分配的块,不是文件内容本身。 一百万个 1 字节的文件占用的空间远超一百万字节。du --apparent-size 显示的是另一个数字。
  • 如果 du 和 df 的结果差异很大,先停下来。 那是另一个问题——文件被删除但仍被进程占用,或者 inode 耗尽。参见下面链接的文章。
  • --max-depth 是 GNU 特有的选项。 在 macOS 上等价的是 du -d 1,sort -rh 也需要较新的 BSD sort 或 coreutils。

相关问题

为什么 du 这么慢? 它要对目录树里的每个文件执行 stat。在网络文件系统或有大量小文件的情况下确实很慢——缩小扫描路径,或者用 ncdu,它至少会缓存扫描结果。

du -s 和 du -h --max-depth=1 有什么区别? -s 打印整个路径的一个总数;--max-depth=1 每个子项打印一行。已经知道该看哪里时就用 -s。

怎么找出超过某个大小的文件夹? 通过 awk 处理:du -m --max-depth=2 . | awk '$1 > 1000' 会列出所有超过 1 GB 的项目。

另请参阅

说出你想看的文件夹大小,CliAI 会写出对应的 du、sort -rh 和 -x。一行命令安装。