du -sh统计的是磁盘实际占用块而非文件逻辑大小,结果不准主因包括:忽略隐藏文件、不跟随符号链接、跳过无权目录、未处理已删除但被进程占用的文件,以及跨文件系统干扰。

直接看目录总容量,用 du -sh 就够了;但结果不准、卡顿、漏统计,往往是因为没理解 -s 和 -h 的作用边界,以及符号链接、硬链接、跨文件系统这些隐性干扰项。
du -sh 为什么有时显示的不是“真实占用”?
du -sh 统计的是磁盘实际占用块(disk usage),不是文件逻辑大小(apparent size)。这意味着:
- 稀疏文件(sparse file)中大量空洞会被计入磁盘占用,但
stat或ls -l显示的Size字段会小得多 - 硬链接重复指向同一数据块,
du默认只算一次(除非加-l) - 符号链接本身几乎不占空间,但
du默认不追踪其目标(加-L才会算进去) - 如果目录下挂载了另一个文件系统(如
/mnt/usb),du默认会跳过(加-x可强制限制,不加则可能意外进入)
想快速看当前目录所有子项各自大小,别只用 du -sh *
du -sh * 看起来直观,但有三个现实问题:
- 通配符
*不匹配隐藏文件(如.git、.env),漏掉关键内容 - 遇到文件名含空格或换行符时,
*展开可能出错,导致统计中断或误报 - 未排序,一眼看不出哪个最大——得拼上
| sort -hr
更稳妥的做法是:du -sh .[!.]* * | sort -hr(覆盖隐藏+非隐藏),或直接用 du -sh --max-depth=1,它天然包含所有项,包括以 . 开头的。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
du -sh 和 df -h 显示容量差很多,该信谁?
这是常见困惑点:df -h 报的是整个文件系统的剩余空间,du -sh 报的是你指定路径下已用的磁盘块。两者不一致,通常说明:
- 有进程正在写日志或临时文件,但文件已被
rm删除——它仍被进程持有,df认为已用,du却找不到路径,因此不统计 - 存在被挂载覆盖的子目录(overlay mount),
du递归时可能绕过或重复计算 - 文件系统预留空间(通常是 5%)对普通用户不可见,
df会扣除,du不感知
排查这类问题,先运行 lsof +L1 查看是否还有“已删除但未释放”的句柄,再结合 du -shx /path(加 -x 防跨文件系统)交叉验证。
大目录下执行 du -sh 很慢?试试这几个轻量替代
对超大目录(如 /var/log 或容器镜像层),du 默认递归扫描所有 inode,耗时长且 I/O 压力大。可考虑:
- 用
du -sh --max-depth=1代替全量扫描,聚焦一级结构 - 加
--exclude跳过明确不需要的子目录,例如:du -sh --exclude='cache' --exclude='tmp' - 用
du -sB1(字节级精度)配合awk '{sum += $1} END {print sum}'替代-h,避免格式化开销 - 若只需对比变化,记录上次
du -s结果哈希值,用find /path -type f -printf '%T@ %p\n' | sort -n | tail -n 1快速定位最近修改项
真正容易被忽略的,是 du 对权限错误的静默处理——遇到无读权限的子目录,它就跳过,也不报错,最终结果偏小。检查时记得加 2>/dev/null 重定向前先去掉,看看 stderr 有没有 “Permission denied”。










