ls 和 du 在文件大小上有几个数量级的分歧

Dav*_*rks 0 ls ubuntu disk-usage

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial
Run Code Online (Sandbox Code Playgroud)

我自己的 linux mint 笔记本电脑上的结果按预期显示:

$ lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 18.3 Sylvia
Release:        18.3
Codename:       sylvia
Run Code Online (Sandbox Code Playgroud)

Ral*_*edl 8

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

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

编辑

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

cp --sparse=always -p file new_file
Run Code Online (Sandbox Code Playgroud)