我们平常使用右键或者ls -l看到的文件大小都是指这个文件它本身内容的大小。比方说一个文本文件,里面写了ab,那么它二进制内容实际是61610a,也就是ab换行符,那么总共占了3个byte。所以右键以及ll看到的结果应该是3。而用du结果是4K(因人而异),为什么会不同呢?
这是因为du=disk usage,它指这个文件放到磁盘中占了多少空间,当然3byte<4K,但是block是最小的单位,因此这个文件就占用了一个block,大小也就是4K。有一种计算方法可以帮助理解,但是正确性我没有考证:假如文件是13K,1个block大小是4K,那么du结果是多少呢?13/4=3.25,也就是该文件要占3个多block,因此磁盘占用就应该是4个block,du结果应该是4*4=16K。
从上面我们可以看到,du是计算文件占了多少个block,似乎du结果总应该大于等于文件内容的,也就是du结果总大于等于ll的,但也不尽然。如果你出现了du结果只有几K,但是右键一看文件竟然有好几M甚至上G,也不要惊讶,这是有可能的。
linux中有一种文件叫做sparse file,它可以延迟分配磁盘空间,特别适合虚拟机。比方说你为虚拟机分配了1G的虚拟磁盘空间,也就创建了一个1G的磁盘文件,但是如果你还没有打开虚拟机使用这个文件,它实际上是没有任何内容的,也就是说没有产生磁盘占用。这个时候,ll结果将是1G,而du结果是0。sparse file使用了dd命令的seek参数,具体原理大家可以再查。这种情况被某些人称作文件的黑洞,很形象。
du有一个参数是 --apparent-size,效果与ll相同。