du是唯一能准确统计目录真实磁盘占用的命令,它递归累加文件系统实际分配的块数,而非文件逻辑大小或目录元数据(如ls -ld显示的固定4KB),并支持--apparent-size等选项区分逻辑与物理大小。

du 是唯一能告诉你“文件夹实际占了多少磁盘空间”的命令——它统计的是文件系统真正分配的块(block),不是文件逻辑大小,也不是目录元数据那 4KB。
为什么 ls -ld 显示的目录大小永远是 4K 或 8K?
因为 ls 只读取目录自身的 inode 和目录项(dentry)结构占用的空间,和里面存了多少文件完全无关。一个空目录和塞满百万小文件的目录,在 ls -ld 下可能都显示 4.0K。这不是 bug,是设计如此。
du -sh 才是看真实磁盘占用的正确姿势
它递归统计目录下所有文件实际占用的磁盘块总和(含硬链接去重、稀疏文件按实占计算):
-
du -sh /var/log:直接看/var/log总大小,带单位(M/G) -
du -sh --max-depth=1 /var/*:只看/var下一级各目录的大小,快速定位大户 -
du -sh /path | grep -E 'G|M$':过滤出 GB/MB 级别结果,避免被 KB 条目淹没
当 du 和 df 结果对不上时,你在看什么?
常见现象:df -h 显示已用 95%,但 du -sh /* 加起来才 80%。这通常不是磁盘坏了,而是:
- 有进程正打开着已被
rm删除的大文件(如日志),du不再计入,df还锁着空间 —— 查lsof +L1或find /proc/*/fd -ls | grep deleted - 文件系统保留了 root 预留空间(默认 5%),
df算在“已用”里,du不会体现 - 挂载了其他文件系统(比如
/home单独分区),du /*扫不到,但df会统计整个块设备
别踩这些坑
du 默认不处理符号链接指向的内容;遇到挂载点会跨进去统计(除非加 -x);权限不足的子目录会被跳过且不报错 —— 如果发现结果明显偏小,先检查是否漏了 sudo,或加 -x 避免误入 /proc、/sys 等伪文件系统:
- 安全排查用:
sudo du -shx --max-depth=1 / | sort -hr - 避开伪文件系统干扰:
du -shx /usr比du -sh /usr更可靠 - 想看“文件自身大小”而非“磁盘占用”?加
--apparent-size,但注意这和释放空间无关
du -shx 为准;df 告诉你还能不能写入;两者差值里藏着最常被忽略的“已删未释”问题。


















