du是Linux中统计目录或文件磁盘占用的核心命令,关键用法包括:-h人性化显示、-s仅汇总总大小、--max-depth限制层级,如du -sh */可安全查看当前目录下一级子目录占用,配合sort -hr能快速定位空间大户。

du 是最直接、最可靠的命令,但默认行为容易误导——它不自动汇总、不人性化显示、不按需过滤层级。想快速看清“各个目录”占多少空间,关键不是记参数,而是理解你要比什么、在哪比、要不要含子目录。
只看当前目录下一级子目录的大小
这是运维和排查磁盘占用时最常用的操作,比如进到 /var/log 想知道哪个服务日志目录最大。
-
du -h --max-depth=1 *:对当前目录所有条目(不含隐藏项)单独统计,*展开后每个子目录独立触发一次du计算,结果清晰可比 -
du -sh */:更安全,*/只匹配目录,避免把普通文件也塞进去;-s强制只出总和,-h保证单位易读 - ⚠️ 常见错误:
du -h --max-depth=1 .会把当前目录.自身也列出来,最后一行是总计,干扰判断;应避免用.当目标,改用*/或显式列出路径
包含隐藏目录(如 .git、.config)的一级统计
很多项目根目录下有隐藏目录,它们可能悄悄吃掉大量空间,但 */ 不会匹配它们。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
du -sh .[!.]* */ 2>/dev/null:匹配以.开头、且第二个字符不是.的条目(即排除.和..),再加*/匹配普通目录;2>/dev/null吞掉权限拒绝报错 -
du -sh .*/ */ | sort -hr:先统一输出,再用sort -hr从大到小排,一眼定位大户 - ⚠️ 注意:
.??*写法看似能跳过.和..,但在空目录下可能不展开,行为不稳定,不如.[!.]*可靠
查某个具体路径下所有子目录的大小(不限层级)
比如要审计 /home 下每个用户的主目录用量,但不想被深层嵌套的缓存目录刷屏。
-
du -sh /home/*/ | sort -hr:只取/home下一级用户目录,-s确保每行一个汇总值,sort -hr按人类可读格式倒序 -
du -h --max-depth=2 /opt | grep '/opt/[^/]*$':先递归两层,再用grep过滤出只到二级目录的行(即/opt/xxx形式),适合结构固定但子目录名不规则的场景 - ⚠️ 避坑:
du -h /path默认输出所有层级,动辄几百行;不加-s或--max-depth就等于主动放弃可读性
为什么不用 df 查“目录大小”
df 看的是**文件系统挂载点**的使用情况,不是目录。例如 /data 是一个独立挂载的 LV,df -h /data 显示的是整个逻辑卷容量,跟 /data/app/logs 里有多少文件无关。
- 当你执行
df -h /var,看到的是/dev/vda2这个分区的整体使用率,哪怕/var下只有三个空目录,它也会显示“已用 28%” - 真正要定位“哪个目录吃空间”,必须用
du;df只负责告诉你“该不该扩容”,du才告诉你“该删谁” - 例外情况:如果某目录恰好是挂载点(如
/mnt/backup),df -h /mnt/backup有效,但这时你其实是在查设备,不是查目录内容
实际操作中,最容易被忽略的是权限问题——du 遇到无读权限的子目录会报错并跳过,导致结果偏小。加 2>/dev/null 能让命令跑完,但也掩盖了真实瓶颈。真要审计全盘,得切到 root 或用 sudo du -sh /path,否则看到的只是“你能看到的那一部分”。

















