Linux du命令显示目录大小有误?查看目录磁盘占用的最佳方法
目录大小统计结果差异及解决方案
你观察到的统计偏差核心来自两种统计口径的本质区别:
- 自行递归累加得到的是所有文件的逻辑内容总大小,仅统计文件内有效数据的字节数
du -sh返回的是目录整体在磁盘上的实际占用空间,包含磁盘块预留空间、目录元数据等额外占用
你当前场景中2个小文件总内容大小为864B,得到12KB的
du结果是典型的磁盘块分配导致的:
主流Linux文件系统默认块大小为4KB,哪怕文件内容不足4KB,也会占用完整的1个块空间;同时目录本身作为特殊文件,存储文件列表、权限等元数据也需要占用1个4KB块。2个文件各占4KB+目录占4KB,总和刚好为12KB,和你的测试结果完全吻合。
其他可能导致统计偏差的原因
- 稀疏文件:存在空洞的稀疏文件逻辑大小远大于实际占用的磁盘空间,此时
du结果会远小于逻辑大小累加值 - 隐藏文件:递归统计时如果过滤了
.开头的隐藏文件/目录,会漏算对应空间 - 硬链接:多个硬链接指向同一个数据块时,
du默认只会统计一次,递归累加如果重复计数硬链接会导致结果偏大
不同统计需求的实现方案
需求1:统计文件有效内容总大小(和你累加的864B结果一致)
- Python实现:递归遍历目录下所有普通文件,累加
os.stat(文件路径).st_size即可 - Linux命令实现:
find 目标目录路径 -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum " Bytes"}'
也可以直接给du加参数获取对应结果:du -sb 目标目录路径
需求2:统计磁盘实际占用总大小(和du -sh结果一致)
- Python实现:遍历目录下所有文件、子目录,累加
os.stat(路径).st_blocks * 512即可(st_blocks的单位为512字节) - Linux命令实现:直接使用默认
du命令:du -sh 目标目录路径
内容的提问来源于stack exchange,提问作者KZiovas
相关产品推荐
相关产品推荐

