<p>定位磁盘空间根因需用du归类统计:①du -sh | sort -rh查当前目录最大子项;②du -sh /var/ 2>/dev/null | sort -rh指定路径避权限问题;③du -sh --max-depth=1 / | sort -rh | head -15逐层收缩范围;④find结合du按类型时间聚合统计。</p>

磁盘空间告急时,df -h 只能告诉你“哪个挂载点满了”,但无法回答“为什么满”——真正要定位根因,必须用 du 做归类统计,再结合排序、过滤和路径聚焦。
du -sh * | sort -rh:快速定位当前目录下最大子目录
这是最常用的归类起点,适用于排查 /var、/home、/opt 等一级目录内部膨胀问题。
-
du -sh *统计当前目录下每个直接子项(文件或目录)的总大小,-s避免递归展开,-h保证可读 -
| sort -rh按人类可读单位倒序排列(-r),最大的排最前 - 常见误操作:漏掉
*导致du -sh只输出当前目录总大小,无法归类 - 注意权限:若某子目录无读权限(如
/var/log/journal),du会报permission denied并跳过——此时需加2>/dev/null过滤错误,或切到 root 执行
du -sh /var/* 2>/dev/null | sort -rh:指定路径归类,避开权限干扰
当明确怀疑某个挂载点(如 /var)时,直接对该路径下的子目录做归类,比在根目录下跑全量更高效、更安全。
-
/var是日志、缓存、包管理器数据库的高发区,/var/log、/var/cache、/var/lib常年霸榜 -
2>/dev/null抑制权限错误输出,避免干扰排序结果(否则sort可能因混入错误信息而失效) - 若想进一步下钻,比如发现
/var/log占用异常,可再执行du -sh /var/log/* 2>/dev/null | sort -rh | head -10 - 不要用
du -sh /var/**/*:bash 的 glob 展开可能触发 “argument list too long” 错误,尤其小文件极多时
du -sh --max-depth=1 / | sort -rh | head -15:从根目录逐层收缩归类范围
当不确定问题出在哪一层时,用 --max-depth=1 强制只统计一级子目录,避免被深层嵌套拖慢速度或淹没关键项。
-
--max-depth=1是关键参数,它让du不递归进子目录内部,只算每项自身 + 其直系内容总和 -
head -15限制输出行数,防止因/proc、/sys等虚拟文件系统产生大量 0B 条目干扰判断 - 注意:
/proc和/sys在du中常显示为 0 或极小值,但它们不占真实磁盘空间——这类结果可忽略 - 若发现
/usr或/opt排名靠前,再对其单独执行du -sh --max-depth=1 /usr/* 2>/dev/null | sort -rh下钻
du -sh $(find /var -type f -name "*.log" -mtime +30) 2>/dev/null | awk '{sum += $1} END {print sum " MB"}':按类型+时间归类统计
纯大小排序不够时,需结合文件类型、修改时间等维度做聚合归类——这时得组合 find 和 du,而非依赖 du 单独完成。
- 上面命令统计
/var下所有 30 天前的.log文件总大小,适合验证“日志堆积是否主因” -
find的-type f排除目录,-name和-mtime控制匹配条件,避免误伤 -
awk聚合求和,比肉眼扫几十行更可靠;注意单位一致性——du -sh输出带单位,awk无法直接计算,应改用du -sm(统一为 MB) - 更稳妥写法:
find /var -type f -name "*.log" -mtime +30 -print0 | xargs -0 du -sm | awk '{sum += $1} END {print sum " MB"}',用-print0和-0处理含空格路径
归类统计真正的难点不在命令本身,而在于理解哪些路径天然易膨胀、哪些 du 参数会隐式改变统计逻辑(比如 -S 与 -s 对子目录是否计入的差异),以及如何把零散结果拼成完整归因链。别跳过 2>/dev/null 和 --max-depth 这类细节——它们往往决定你花 2 分钟还是 20 分钟找到根因。


















