du --max-depth=1 是控制目录深度的核心参数,用于只显示目标目录下一级子项(文件和子目录)的磁盘占用,不递归深入,但依然完整扫描所有文件;它剪裁输出而非跳过计算,配合 -h、sort -hr 和 -x 等可高效定位大目录。

du --max-depth=N 是控制目录深度的核心参数
想看某目录下“第一层”子目录各占多少空间,而不是递归进每一层算到底,--max-depth=1 就是你要的开关。它不改变统计逻辑,只限制输出层级——du 依然会完整扫描所有文件,但只在指定深度内展示结果。
常见误用是以为 --max-depth 能跳过深层扫描、提升速度,其实不能。它只是“剪裁输出”,不是“跳过计算”。真正影响性能的是是否遍历大量小文件,而非深度本身。
-
du -h --max-depth=1 /var:只列出/var下一级目录(如/var/log、/var/cache)的总大小,不展开/var/log/journal -
du -sh --max-depth=0 /home:--max-depth=0等价于-s,只输出/home总大小,不显示任何子项 -
du -h --max-depth=2 /opt:显示/opt自身、它的直接子目录、以及这些子目录的直接子目录(两层),但不会到第三层
为什么 du -sh * 和 du -h --max-depth=1 结果可能不同
du -sh * 看似等效,实则危险:它依赖 shell 展开 *,遇到大量文件时会触发 “Argument list too long” 错误;且无法处理隐藏目录(如 .config),也不包含当前目录名本身。
du -h --max-depth=1 是更健壮的选择,它由 du 自己遍历,不受 shell 参数长度限制,能正确包含点开头的目录,并始终以路径为前缀输出。
- 当
/tmp下有 5000 个临时文件时,du -sh *极大概率失败,而du -h --max-depth=1 /tmp稳定运行 -
du -sh *输出类似12K cache,你得自己推断这是./cache;du -h --max-depth=1明确输出12K /tmp/cache - 若需包含隐藏目录,
du -h --max-depth=1 /path/.* /path/* 2>/dev/null才能勉强覆盖,远不如直接用--max-depth
配合 sort 和 head 快速定位最大子目录
单纯看深度不够,关键是要排序后取 Top N。sort -hr 是人类可读单位排序的标配,但要注意:部分旧版 sort(如 CentOS 6)不支持 -h,此时必须用 du -k 转 KB 再 sort -rn。
-
du -h --max-depth=1 /var | sort -hr | head -n 5:最常用组合,找/var下前 5 大一级子目录 -
du -k --max-depth=1 /home | sort -rn | head -n 10:兼容老系统,KB 单位数值排序更稳定 - 别漏掉
2>/dev/null:某些子目录权限不足时会报Permission denied,干扰管道输出,加重定向过滤掉
跨文件系统时 --one-file-system(-x)必须和 --max-depth 同用
如果目标路径挂载了多个文件系统(比如 /home 是独立分区,/home/user/.cache 又挂了 tmpfs),默认 du 会跨区统计,导致结果失真。这时 -x 不是可选项,而是必要约束。
-
du -shx --max-depth=1 /:确保只统计根文件系统内的内容,跳过/proc、/sys、/run等虚拟或挂载分区 -
-x和--max-depth无先后顺序,但必须同时出现,否则-x可能被忽略 - docker 场景下特别重要:
/var/lib/docker常是单独挂载,用du -shx --max-depth=1 /var才能真实反映宿主根分区占用
实际执行时,--max-depth 的值选 1 还是 2 往往取决于你手头问题的颗粒度——系统级排查用 1,应用级深挖用 2,再深基本就得换 find + du -sh 组合了。


















