什么是最可靠的命令来查找文件linux的实际大小

时间:2015-07-15 17:31:31

标签: linux unix

最近我尝试使用各种命令找出文件的大小,但它显示出巨大的差异。

ls -ltr显示其大小约为34GB(字节由我四舍五入) du -sh filename显示它大约为11GB。而 stat命令显示大约34GB左右。 任何想法,哪个是最可靠的命令来查找文件的实际大小?

对它执行了一些复制操作,我们不确定这是否适当完成,因为在执行复制的某个时间源文件被我们的工作删除后。

3 个答案:

答案 0 :(得分:16)

这里没有不准确或可靠性问题,您只是比较两个不同的数字:逻辑大小与物理大小。

这是Wikipedia's illustration for sparse files

Sparse files

ls显示灰色+绿色区域,即文件的逻辑长度。 du(没有--apparent-size)仅显示绿色区域,因为这些区域占据了空间。

您可以使用dd count=0 bs=1M seek=100 of=myfile创建稀疏文件。

ls显示100MiB,因为这是文件的长度:

$ ls -lh myfile
-rw-r----- 1 me me 100M Jul 15 10:57 myfile

du显示0,因为它分配了多少数据:

$ du myfile
0 myfile

答案 1 :(得分:4)

ls -l --block-size=M

会为您提供长格式列表(需要实际查看文件大小)并将文件大小舍入到最接近的MiB

如果您想要MB(10 ^ 6字节)而不是MiB(2 ^ 20字节)单位,请改用--block-size=MB

如果您不希望将M后缀附加到文件大小,则可以使用--block-size=1M之类的内容。感谢StéphaneChazelas的建议。

ls的手册页中对此进行了描述; man ls并搜索SIZE。它允许除MB/MiB以外的单位,并且从它的外观(我没有尝试过)也可以使用任意块大小(所以你可以看到文件大小为412字节块的数量,如果你想)。

请注意,--block-size参数是Open Group的ls之上的GNU扩展,因此如果您没有GNU userland(大多数Linux安装都这样做),这可能不起作用。如上所述,GNU coreutils 8.5中的ls支持--block-size

答案 2 :(得分:3)

文件大小有几种概念,如that other guiy's answer中所述和sparse files上的wikipage数据。

但是,您可能希望同时使用ls(1)和& stat(1)命令。

如果使用C编码,请考虑使用stat(2)& lseek(2)系统调用。

另请参阅this answer中的参考资料。