Linux没有直接显示目录占用空间百分比的命令,因为du只统计目录自身大小且不读取文件系统元数据,需手动结合df获取挂载点总容量再计算;实际中更推荐用du配合sort排序找相对最大目录。

Linux 本身没有直接显示「每个目录占用空间百分比」的命令,因为百分比需要一个明确的分母(比如所在文件系统的总容量),而 du 只算目录自身大小,不感知挂载点边界。
为什么 du 不会、也不能直接给出百分比
du 的设计目标是递归统计文件和目录的磁盘用量,它只关心路径下的数据块,不读取文件系统元数据(如总大小、已用/可用块数)。所以你执行 du -sh /var/log 得到的是 2.1G,但无法自动除以 /var 所在分区的总容量来算出百分比——除非你手动拼接 df 和 du 的结果。
-
df /var/log能告诉你/var/log所在的挂载点(比如/)及其总容量和使用率 -
du -sh /var/log告诉你该目录实际占了多少 - 但二者之间没有内置关联逻辑,
du不会主动查df,也不会做除法
如何手动算出某个目录占其所在文件系统的百分比
核心思路:先用 df 找出目录所在挂载点的总大小(Size 字段),再用 du 获取该目录大小,最后用 shell 计算。例如:
du -sb /var/log | awk '{d=$1} END {getline < "/proc/mounts"; while((getline line < "/proc/mounts") > 0) if (line ~ /\/var\/log[[:space:]]/) {split(line,a," "); print int(d/a[3]*100) "% (" d "B / " a[3] "B)"}}'更实用、可读性强的做法是分两步:
- 运行
df -h /var/log,记下Size列(比如39G)和Mounted on(比如/) - 运行
du -sh /var/log(比如输出2.1G) - 心算或用
echo "scale=1; 2.1 / 39 * 100" | bc得到约5.4%
注意:df 的 Size 是整个挂载点容量,不是父目录容量;不存在「/var 占 / 的百分比」这种现成指标,必须自己定位层级关系。
du 配合 sort 找出「相对最大」的目录(替代方案)
如果你真正想解决的问题是「哪个目录最吃空间,值得优先清理」,那不需要绝对百分比,用排序更高效:
du -sh /* 2>/dev/null | sort -hr | head -5
-
du -sh /*统计根下一级各目录大小 -
2>/dev/null屏蔽权限拒绝错误(如/proc) -
sort -hr按人类可读数值逆序排(G > M > K) - 结果里排第一的,就是当前根下「占比最高」的候选目录(虽然没算出确切百分比,但排序本身已反映相对权重)
如果要深入某目录(如 /var),再执行 du -sh /var/* 2>/dev/null | sort -hr | head -5,逐层下钻。
容易被忽略的关键细节
真正卡住人的往往不是命令怎么写,而是两个事实:
-
du默认统计的是「实际占用的磁盘块」,受稀疏文件、硬链接、压缩文件系统(如 btrfs/zfs)影响,可能和ls -l显示的大小不同 -
df显示的Use%包含保留块(root reserved blocks),而du不计入这部分——所以即使du总和远小于df的Used,Use%仍可能接近 100%
这意味着:你算出来的「目录百分比」只是近似参考,不能替代 df 的整体水位判断。磁盘是否真要满了,永远以 df -h 的 Use% 为准。


















