ls 和 du 对文件大小的看法不一致,相差几个数量级

ls 和 du 对文件大小的看法不一致,相差几个数量级

有谁明白为什么我会得到这些结果?请注意以下两个命令之间的文件大小差异:

$ ls -lh gauss_landmarks_0000.npy 
-rw-rw-r-- 1 dparks dparks 1.1G Aug 16 12:43 gauss_landmarks_0000.npy

$ du -h gauss_landmarks_0000.npy 
20M     gauss_landmarks_0000.npy

这种情况发生在如下所示的机器上:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial

我自己的 Linux Mint 笔记本电脑上的结果符合预期:

$ lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 18.3 Sylvia
Release:        18.3
Codename:       sylvia

答案1

它可能是一个稀疏文件。这意味着并非所有块都被分配,并且文件使用的空间比文件大小建议的要少得多。读取时,丢失的块将读取为零。

您还可以使用-s选项ls查看分配的大小,它应该与报告的大小相同du

编辑

如果您知道或怀疑某个文件包含许多零字节但不稀疏,则可以使用cp --sparse=always它使其稀疏,从而可能节省大量磁盘空间。

cp --sparse=always -p file new_file

答案2

在您的情况下,差异确实是由稀疏文件引起的,如其他答案中所述。

当涉及整个目录时,另一个差异来源是硬链接。默认情况下,du不会对硬链接进行多次计数,这可能会导致du报告的数量比显示的少得多ll -sh

要检查是否涉及硬链接,您可以运行du -l,以便它也多次计算硬链接,或者您可以运行ll -i <DIR> | sort.左栏将显示 inode id,如果重复,则文​​件之间是硬链接。

相关内容