ncdu比du命令更快更可靠,因其直接统计磁盘块占用,不受稀疏文件、硬链接或挂载点干扰;默认显示的“Total disk usage”才是真实空间占用,与du -sh一致,而“Apparent size”为逻辑大小。

直接用 ncdu 扫描,比拼凑 du 命令快得多,也更可靠——它统计的是实际占用的磁盘块(disk blocks),不是文件逻辑大小(apparent size),不会被稀疏文件、硬链接或挂载点干扰。
为什么 ncdu 显示的大小和 du -sh 不一致
这是最常被误解的一点:ncdu 默认显示的是「磁盘实际占用」(disk usage),而 du -sh 如果没加 --apparent-size,其实也是磁盘占用;但很多人误用 ls -lh 或 stat 看到的是逻辑大小(比如一个 10GB 的稀疏日志文件,ls 显示 10G,但真正占磁盘可能只有 200MB)。ncdu 在底部会同时显示两行:
Total disk usage: 42.3 GiBApparent size: 41.9 GiB
前者才是你该关心的“真·空间杀手”。如果两者差距大,说明存在大量稀疏文件、未清空的已删除但仍被进程占用的文件(/proc/*/fd/ 下可见),或有硬链接重复计数问题。
扫描时必须加 -x 参数的三种情况
不加 -x 很容易误扫进其他挂载点(比如 /mnt、/media、/var/lib/docker 跨文件系统),导致结果失真甚至卡死:
- 清理根分区时,运行
sudo ncdu -x /,避免跳进/boot/efi或/proc这类伪文件系统 - 排查
/var空间暴增,用sudo ncdu -x /var,否则可能把/var/lib/docker下的 overlay2 子卷当成普通目录反复扫描 - 在容器宿主机上查用户家目录,加
ncdu -x ~,防止意外进入/home/user/.local/share/flatpak这类绑定挂载目录
交互界面里删错文件怎么办
ncdu 的 d 键删除是真实 unlink,没有回收站。但它有两层防护:
第一层:按 d 后会弹出确认提示,必须输 y 并回车;
第二层:如果文件正被进程占用(比如 tail -f 正读着的日志),ncdu 删除会失败,并在右下角显示 Cannot remove: Device or resource busy。
但要注意:某些场景下它不会报错却删得不干净——比如 /var/log/journal 下的二进制日志,直接删文件可能残留索引;正确做法是先停服务:sudo systemctl stop systemd-journald,再进 ncdu 删,删完再 start。
扫描卡住或内存爆满时的应急操作
遇到超大分区(如 50TB NAS 挂载点)或内存紧张(
- 按
Ctrl+C可中断统计,ncdu会立即进入已扫描部分的交互界面,至少能看顶部几十个最大项 - 用
--exclude快速跳过已知安全区:ncdu --exclude '/home/*/.cache' --exclude '/tmp' /home - 预生成快照避免重复扫描:
ncdu -o ~/ncdu-root.dat -x /,之后用ncdu -f ~/ncdu-root.dat秒开
真正难搞的是那些不显示在 ncdu 列表里的“幽灵占用”:比如已删除但仍被 nginx 或 java 进程打开的文件(lsof +L1 可查)。这时候 ncdu 再快也没用,得切到 /proc 层面动手。











