最常用场景是du -h --max-depth=1查看当前目录下所有直接子目录和文件的大小,限制仅统计第一层,避免深层递归;--max-depth=0等价于-s,只显示总计。

du --max-depth=1 查当前目录一级子项大小
这是最常被需要的场景:你想快速知道当前目录下哪些子目录或文件吃掉了最多空间,又不想被深层嵌套的输出刷屏。--max-depth=1 就是干这个的——它限制只统计到第一层,不递归进子目录内部。
常见错误是写成 --max-depth=0,结果只看到一行总大小,误以为命令没生效。其实 --max-depth=0 等价于 -s,只输出当前目录合计值,不列任何子项。
-
du -h --max-depth=1:列出当前目录下所有直接子目录和文件的大小(含隐藏项) -
du -sh --max-depth=1 /var:以汇总形式显示/var下每个一级子路径的大小 - 如果某子项是符号链接,默认不展开;加
-L才统计它指向的目标大小
du --max-depth 和 -a 的组合效果
-a 让 du 显示文件(不只是目录),但和 --max-depth 一起用时,容易误解输出含义。比如 du -ah --max-depth=1 并不是“只显示当前目录下的所有文件”,而是“显示当前目录下所有**直接子项**(包括文件+子目录),且对每个子目录**不深入统计其内部**”。
也就是说:/home/user/logs/ 是个子目录,--max-depth=1 下它只贡献一行大小(即整个 logs/ 目录占的空间),不会把 logs/a.log、logs/b.log 单独列出来——除非你同时加了 -a,且该子目录本身被当作“文件项”处理(但它仍是目录类型)。
- 要真正列出当前目录下所有文件(不含子目录内容),用
du -ah --max-depth=1 | grep -v '/$' -
--max-depth=2配-a才可能看到二级路径里的单个文件,但输出会变长,慎用 - 注意权限:遇到
du: cannot read directory,得加sudo或换用户
为什么 du --max-depth 结果和 df 不一致
du 统计的是文件系统中实际分配的块(block)大小,而 df 报告的是挂载点整体可用空间。两者差异常见于:
- 已删除但未释放的文件(进程仍打开):
du看不到,df已扣减 - 硬链接:默认不重复计算,加
-l才算多次 - 稀疏文件(sparse file):
du按实际占用块计,--apparent-size才按逻辑大小(如dd if=/dev/zero of=test bs=1M seek=999 count=1创建的 1GB 文件可能只占几 KB 磁盘) - 不同文件系统挂载点:
--one-file-system(或-x)可避免跨分区跳转,否则--max-depth可能意外包含其他挂载点内容
排序 + 截断:找最大几个目录的惯用写法
单纯 du -sh --max-depth=1 | sort -hr 能排,但要注意两件事:一是 sort -h 在老系统(如 CentOS 6)不支持,得用 sort -k1,1h 或降级为 sort -nr(配合 -m 单位);二是输出里带单位(K/M/G)时,head -n5 可能截断不干净,因为 total 行(来自 -c)也会被排进去。
- 安全写法:
du -sh --max-depth=1 * 2>/dev/null | sort -hr | head -n5(*排除隐藏项,2>/dev/null屏蔽权限错误) - 想包含隐藏项且去
total行:du -sh --max-depth=1 .[^.]* * 2>/dev/null | sort -hr | head -n5 | grep -v '^0' -
--max-depth值越大,扫描越慢,尤其在大目录下;生产环境慎用 >3
真正容易被忽略的是 --max-depth 对符号链接和硬链接的默认处理方式——它不改变链接本身的计数逻辑,只控制遍历深度。如果你依赖链接目标大小做判断,必须显式加 -L 或 -l,否则结果可能和直觉相反。


















