最近我尝试使用各种命令找出文件的大小,但它显示出巨大的差异。
ls -ltr
显示其大小约为34GB(字节由我四舍五入)
du -sh filename显示它大约为11GB。而
stat命令显示大约34GB左右。
任何想法,哪个是最可靠的命令来查找文件的实际大小?
对它执行了一些复制操作,我们不确定这是否适当完成,因为在执行复制的某个时间源文件被我们的工作删除后。
答案 0 :(得分:16)
这里没有不准确或可靠性问题,您只是比较两个不同的数字:逻辑大小与物理大小。
这是Wikipedia's illustration for 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中的参考资料。