du 和 ls 报告不同的目录大小?

du 和 ls 报告不同的目录大小?

在尝试验证复制操作是否成功完成(或者至少没有跳过任何文件)时,我运行了du -b源目录和目标目录,结果显示差异约为 100KB。

因此,我追踪了差异并找到了一个(众多)叶目录,其中du报告了副本和原始文件的总大小差异。

奇怪的是,ls -l显示这些目录完全相同!

以下是两个不同目录中的两个输出:

root@...:/local/.../DCIM/100___12# du -b
5286222389      .
root@...:/local/.../DCIM/100___12# ls -l --block-size=1
total 5292851200
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
-rwxr--r-- 1 markus markus   2236594 Aug  5  2013 IMG_0005.JPG
...

对阵

root@...:/local_old/.../DCIM/100___12# du -b
5286226485      .
root@...:/local_old/.../DCIM/100___12# ls -l --block-size=1
total 5292851200
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
-rwxr--r-- 1 markus markus   2236594 Aug  5  2013 IMG_0005.JPG
...

请注意,报告的大小du -b小于报告的大小ls -l,并且两个目录的大小不同。全部的两个目录的输出ls -l相同。

此目录中没有符号链接或系统文件。它只是一堆 .jpg 文件(直接从相机的 SD 卡复制)和 Windows 为它们创建的 Thumbs.db 文件(通过 samba)...

我是否遗漏了有关这些命令应如何工作的某些信息?

(我正在运行 Debian Wheezy 并uname -a输出Linux ... 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux

答案1

两者都正确。

  • ls显示文件的确切字节
  • 显示磁盘使用情况,这是不同的,因为系统使用块存储文件。

您可以使用以下命令找到文件系统正在使用的块大小:

blockdev --getbsz <partition>

例如:

blockdev --getbsz /dev/sda1

答案2

-a将开关添加到后ls,我得到:

root@...:/local/.../DCIM/100___12# du -b
5286222389      .
root@...:/local/.../DCIM/100___12# ls -al --block-size=1
total 5292867584
drwxr-xr-x 2 markus markus     12288 Aug  5  2013 .
drwxr-xr-x 4 markus markus      4096 Aug  5  2013 ..
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
...

对阵

root@...:/local_old/.../DCIM/100___12# du -b
5286226485      .
root@...:/local_old/.../DCIM/100___12# ls -als --block-size=1
total 5292871680
drwxr-xr-x 2 markus markus     16384 Aug  5  2013 .
drwxr-xr-x 4 markus markus      4096 Aug  5  2013 ..
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
...

注意 -directory 大小的差异.,它恰好弥补了 报告的差异du -b

此外,似乎全部的报告的单位ls实际上是块而不是字节。所以答案是@jcbermu建议,但倒退了:

是的,两者都正确,但ls报告全部的使用的 fs 块的大小(但单个文件的大小以字节为单位)并du -b报告字节。

我看到的源和目标之间的差异是由 报告的大小差异引起的.。这从何而来,又是另一个故事。可能是因为一个在某个时候比另一个保留了更多的目录条目。但至少现在我不再担心在复制过程中遗漏了什么。下一步是弄清楚如何告诉du忽略...总数,这应该可以解决我的问题。

相关内容