du -h和ls -lh有什么区别?


31

我很难掌握读取文件大小的正确方法,因为每个命令都会给您带来不同的结果。我还在http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html上看到了一篇文章,内容如下:

du会为您提供文件驻留在文件系统上的大小。(IE始终会为您提供被1024整除的结果)。

ls将为您提供文件的实际大小。

您正在查看的是文件的实际大小与其占用的磁盘空间量之间的差异。(也称为文件系统效率)。

它驻留在文件系统上与fil的实际大小之间有什么区别

Answers:


48

这称为松弛空间

当数据文件小于文件系统能够跟踪的最小数据单元时,位于单个位和字节之上的每一层抽象都会浪费空间。扇区,群集或块内浪费的空间通常称为松弛空间,通常不能用于存储其他数据。对于单个256字节的扇区,最大浪费空间为255字节。对于64 KB群集,最大浪费空间为65,535字节。

因此,如果文件系统以64 KB为单位分配空间,并且存储了3 KB文件,则:

  • 该文件的实际大小为3 KB。
  • 该文件的驻留大小为64 KB,因为该单元中剩余的61 KB无法分配给另一个文件,因此丢失了。

注意:某些文件系统支持块子分配,这可以通过将多个小文件(或大文件的尾端)分配到同一块中来缓解此问题。


1
那是该死的很好的解释。
SpacemanSpiff

1
@ Handyman5-谢谢Handyman5。因此,当我使用ls查看文件或文件夹的大小时,它会返回实际大小,而du会返回常驻大小?那是对的吗?因此,当查看文件的大小时,最准确的大小即驻留大小或文件大小,还是一个任意的问题?
PeanutsMonkey 2011年

8
@PeanutsMonkey,准确性在情人眼中。;-)基本上,如果您担心文件在其他地方会占用多少空间(例如通过网络复制,添加到zip文件,备份到外部驱动器等),那么实际大小就是多少你在乎。如果您担心文件现在所在的驱动器上剩余的空间量,则需要考虑驻留大小。由于du向您显示了disk usage,因此它正在查看当前驱动器上已占用的空间,因此它显示了驻留的大小。
Handyman5

1
@ Handyman5-帖子发布已经快一年了,但很好奇上面的答案在使用时df -h有何不同?
PeanutsMonkey 2012年

1
df报告剩余块数*文件系统块大小。在这种情况下,它更像du,因为即使部分使用的块也被视为已完全分配。df基本上可以翻译statvfs,因此您可以查看该系统调用以更好地了解发生了什么。
Handyman5

19

这里还有一个未解决的选项- 稀疏文件。在这种情况下,du会显示出比单纯的尺寸更小ls -l会,因为ls是报告的文件的“大小”作为是明显的大小(你能读懂,如果你想一大堆零的字节数),而du意志继续使用实际使用的磁盘块数。

有趣的窍门:创建大量的稀疏文件,然后用您拥有的磁盘空间打动您的朋友(“看起来,我正在硬盘上存储大量的1TB文件!”)。好吧,那也许没那么有趣。


6

文件系统由块组成。文件不必整齐地放入块中。如果文件为1024字节,则文件大小为ls,du为1024。如果文件大小为1025,则文件大小为1025(ls)和2048(du)。

请注意,上面的示例假设数据块大小为1024。如今,较大的数据块大小已成为标准做法,例如,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred

0

还有另一个原因可能是它们不同。du -h知道何时以另一个名称(硬链接,而不是符号链接)看到相同的文件,并且会报告每个文件的大小,但仅将大小添加一次到公共父目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.