Linux下du与ls命令显示大小不一致的原因及正确性咨询
Linux下du与ls命令显示大小不一致的原因及正确性咨询
哈喽,我来帮你拆解这个问题哈~
首先得明确一点:ls和du显示的数值其实都是“正确的”,只是它们统计的是完全不同的维度:
ls输出的是文件的逻辑大小,也就是文件内容本身的字节数——简单说就是这个文件“应该”占用的空间,如果把它复制到一个不支持特殊存储机制的系统/设备上,就会占用这么多空间。du输出的是文件实际占用的磁盘空间,也就是系统为这个文件分配的磁盘块总大小,反映的是当前磁盘上真实被消耗的空间。
回到你的情况,209G和196G的差异,最可能的原因有两个:
- 文件系统透明压缩:如果你的磁盘用了支持透明压缩的文件系统(比如ZFS、Btrfs,或者开启了压缩功能的ext4),大文件会被自动压缩存储。PGN作为文本文件,里面有大量重复的棋局结构、空格或者相同的字符串,压缩率会很高,实际占用的磁盘空间自然比原始逻辑大小小很多,这就会出现
ls显示原始大小,du显示压缩后实际占用空间的情况。 - 稀疏文件:虽然你觉得PGN是普通文本文件,但如果下载过程中用的工具支持稀疏文件(比如某些断点续传工具),或者文件本身被处理成了稀疏格式——也就是文件里存在大量连续的空字节,系统不会为这些空字节分配实际的磁盘块,而是用标记记录这些区域。这时候
ls会按逻辑大小统计(把空字节也算进去),但du只会统计实际分配的磁盘块大小。
针对你编辑里的疑问:就算是完整下载的PGN文件,也可能因为上面说的文件系统压缩导致空间差异,不一定是稀疏文件哦~很多人会给存储大文件的磁盘开启透明压缩,这是很常见的优化手段。
总结一下:如果想知道文件本身的内容大小,看ls的结果;如果想知道当前磁盘被这个文件占了多少空间,看du的结果,两者都是准确的,只是统计维度不同。
备注:内容来源于stack exchange,提问作者av06




