du -sh 是Linux下统计目录磁盘占用的最常用、最可靠命令,-s汇总总大小、-h以K/M/G人性化显示;ls -lh仅显示目录inode大小(通常4KB),不递归统计内容,无法反映真实磁盘占用。

直接用 du -sh 就能拿到目录总大小,这是最常用、最可靠的方式。其他命令(如 ls)只显示元数据或单个文件大小,不能反映真实磁盘占用。
为什么不用 ls -lh 查目录大小
ls -lh 显示的是目录本身的 inode 占用(通常 4KB),不是它里面所有文件加起来的磁盘使用量。比如一个装了 20GB 视频的 videos/ 目录,ls -lh videos/ 可能只显示 4.0K —— 这会严重误导你。
- 它不递归统计子目录和文件
- 对硬链接、稀疏文件、块对齐等磁盘实际占用完全不体现
- 权限不足时可能直接跳过某些子项,结果更不可信
du -sh 的核心参数含义
du 是唯一专为“磁盘使用量”设计的命令,-sh 组合最实用:
-s:只输出总计,不列每个子项(避免刷屏)-h:自动转成 KB/MB/GB,人眼可读- 不加
-s会列出所有子目录大小,适合排查大目录位置 - 加
-c(如du -shc dir1 dir2)会在末尾加一行total
权限不足时 du 报错怎么办
常见错误信息:du: cannot access 'xxx': Permission denied。这不是命令错了,是当前用户没读取权限。
- 先确认是否真需要看那些目录(比如
/var/log、/etc下某些子目录) - 如果必须查,用
sudo du -sh /path;但注意sudo后路径别写错,尤其别漏斜杠 - 避免盲目
sudo du -sh /*,可能卡住或触发安全策略 du --exclude='/proc' --exclude='/sys'可跳过虚拟文件系统,减少干扰
快速定位哪个子目录最占空间
想找出“罪魁祸首”,别手动翻,用管道组合:
du -h --max-depth=1 /path | sort -hr:只看一级子目录,按大小倒序du -sh /path/*/ | sort -hr | head -5:排除隐藏目录,取前 5 名- 注意
sort -hr依赖 GNU coreutils,旧系统可能不支持-h,此时用du -s /path/* | sort -nr - 如果目录层级深、文件极多,
du可能慢,这时ncdu(交互式)比纯命令更直观
有个容易被忽视的要点:磁盘使用量并不等同于文件大小的总和。du统计的是实际占用的块(block),这会受到文件系统块大小、稀疏文件、压缩、快照等多种因素的影响。比如说有一个100MB的空洞文件(sparse file),ls -l显示的是100MB,但du可能只显示几KB——这其实是它正常的表现。