快速定位最占空间子目录用du -h --max-depth=1 | sort -hr;查单目录总大小用du -sh;跨分区需加-x对齐df语义;排除干扰用--exclude;权限不足时du默认忽略错误继续统计。

怎么快速定位哪个子目录最占空间
直接用 du -h --max-depth=1,这是排查磁盘告警的第一反应命令。它只统计当前目录下的一级子项,不钻进深层嵌套,避免卡顿或输出爆炸。
- 如果在
/var下执行,你会看到/var/log、/var/cache各占多少,一眼锁定嫌疑目录 - 加
| sort -hr能按大小倒序排列:du -h --max-depth=1 | sort -hr,最大的排最上面 - 注意别漏掉隐藏目录(如
.docker),--max-depth=1默认包含它们;若想排除,得加--exclude='.?*' - 某些旧版 GNU coreutils 不支持
--max-depth,可用-d 1替代(效果一致)
只想看一个目录的总大小,别刷屏
用 du -sh /path/to/dir。-s 是关键——它强制汇总,跳过所有子项展开,输出就一行。
-
du -h /var/log可能输出几百行,而du -sh /var/log就是1.2G /var/log - 路径末尾加不加斜杠不影响结果,但建议统一写成
/var/log/,避免和同名文件混淆 - 如果目录权限不足(比如非 root 查
/var/log/journal),会报Permission denied,但总大小仍能算出——du默认忽略错误并继续,除非你加了-D或--dereference-args
排除日志、缓存等干扰项再统计
真实环境里,*.log、node_modules、__pycache__ 常拖慢分析节奏,也污染判断。用 --exclude 过滤掉更干净。
- 排除所有日志:
du -sh --exclude='*.log' /var - 排除多个模式需重复写:
du -sh --exclude='*.log' --exclude='cache' /opt/app -
--exclude不支持正则,只认 shell 通配符;想排除带空格的路径?得用引号包住整个模式,否则 shell 会提前拆分 - 注意:排除操作不影响硬链接计数逻辑,但会跳过匹配路径的遍历——所以排除后总大小一定 ≤ 未排除时
跨分区时为什么 du 结果比 df 小很多
因为 du 默认会跨挂载点统计(比如进了 /mnt/nfs/data),而 df 只看本分区。这时必须加 -x(即 --one-file-system)来对齐语义。
- 执行
du -shx /才真正代表“根分区实际用了多少”,否则可能把 NFS、tmpfs、/boot/efi 全算进去 - 常见坑:运维脚本里忘了加
-x,监控告警误判为磁盘满,其实是挂载了大容量远程存储 -
-x是硬开关,一旦遇到不同文件系统,立刻停止向下递归,不会报错也不会提示——得靠经验意识到“咦,这里怎么没数据?”










