du -sh | sort -rh 是首选,因它响应快、单位可读、排序准,适合第一轮粗筛;但默认不包含隐藏文件,遇权限错误会报错,需加 2>/dev/null 静默或改用 .[!.] * 匹配隐藏项。

直接用 du -sh * | sort -rh 就能快速看到当前目录下各子项大小排名,但默认不包含隐藏文件,权限错误会报错干扰结果。
为什么 du -sh * | sort -rh 是首选?
它响应快、单位可读、排序准,适合第一轮粗筛。关键在 * —— 只展开当前层,不递归,所以秒出结果。
-
-s让du只输出每个项目的汇总大小,避免逐层打印刷屏 -
-h输出带单位(如2.3G),sort -rh才能按人类习惯正确逆序排 - 遇到权限不足(比如
/var/log/journal子目录),加2>/dev/null静默忽略,但得心里有数:漏掉的可能是真大目录 - 如果当前目录含大量隐藏项(
.git、.cache等),*默认不匹配,得换成du -sh .[^.]* *或du -sh ./*
如何查深层目录里的“真凶”?
当怀疑大文件藏在多层嵌套里(比如 /var/lib/docker/containers/xxx/logs),就得递归扫描,但要注意 -a 和 --max-depth 的取舍。
- 用
du -ah . | sort -rh | head -n 20:列出所有文件+目录,-a是关键,否则单个大文件(如archive.tar.gz)会被跳过 -
sort -rh依赖 locale;若终端不是C或en_US.UTF-8,排序可能错乱,临时加LC_ALL=C更稳 - 输出里像
1.8G ./data/db.sqlite3这种格式,sort -rh能识别,但某些 shell 管道首行可能被吞,补一句| tail -n +1更保险 - 扫根目录时务必加
-x(即du -ahx /),否则碰到/proc、/sys会卡死或报错
什么时候该换 ncdu?
当目录结构深、嵌套杂(如用户家目录、/var/lib/docker),靠肉眼扫几十行 du 输出效率低且易漏——这时候交互式导航才是解法。
- 首次运行
ncdu /前,必须加--exclude /proc --exclude /sys,否则会在虚拟文件系统上卡死,甚至触发 OOM killer - 进入某目录后按
s键重排序,注意:默认排的是“该目录下所有子项的磁盘占用”,不是“子项自身大小”;想看纯文件大小,得先cd进去再按s - 按
i键可查看高亮条目的详细信息,包括实际磁盘占用(on-disk size)和是否含稀疏块等,这点du命令本身不直接提供 -
ncdu边扫描边显示,支持键盘跳转,还能动态切换视图,对长期运行的服务目录(如日志堆积区)更友好
真正容易被忽略的点是:du 统计的是文件系统块占用,而 df 显示的是文件系统总空间。如果两者差值很大,大概率是已删除但进程未释放句柄的文件在占着空间——这时候 lsof +L1 比任何 du 组合都管用。











