为什么`du`的输出通常与`du -b`如此不同

|| 为什么
du
的输出通常与
du -b
如此不同?
-b
--apparent-size --block-size=1
的简写。在大多数情况下,仅使用
--apparent-size
可以得到相同的结果,但是
--block-size=1
似乎可以解决问题。我想知道输出是否正确甚至是偶数,我想要哪些数字? (即实际文件大小,如果复制到另一个存储设备上)     
已邀请:
表观大小是应用程序认为在文件中的字节数。如果您决定通过FTP或HTTP发送文件,则为通过网络传输的数据量(不计算协议标头)。这也是
cat theFile | wc -c
的结果,如果使用
mmap
加载整个文件,文件将占用的地址空间量。 磁盘使用率是由于文件正在占用该空间而不能用于其他用途的空间量。 在大多数情况下,表观大小小于磁盘使用情况,因为磁盘使用情况会计算文件的最后一个(部分)块的完整大小,而表观大小只会计算最后一个块中的数据。但是,当您有一个稀疏文件时,表观大小会更大(当您在文件末尾查找某处然后在其中写入内容时会创建稀疏文件-操作系统不会费心创建很多填充零的块-它只会为您决定写入的文件部分创建一个块。     
最小块粒度示例 让我们玩一点,看看发生了什么。
mount
告诉我我在
/
挂载的ext4分区上。 我发现它的块大小有:
stat -fc %s .
这使:
4096
现在让我们创建一些大小为
1 4095 4096 4097
的文件:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count=\"${size}\" status=none
  echo \"size     ${size}\"
  echo \"real     $(du --block-size=1 f)\"
  echo \"apparent $(du --block-size=1 --apparent-size f)\"
  echo
done
结果是:
size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f
因此,我们看到小于或等于
4096
的任何内容实际上占用了
4096
字节。 然后,一旦我们越过
4097
,它就会上升到
8192
,即
2 * 4096
。 显然,磁盘始终在“ 15”个字节的块边界存储数据。 稀疏文件会怎样? 我没有研究确切的表示是什么,但是很显然ѭ21确实考虑了它。 这可能导致表观大小大于实际磁盘使用量。 例如:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
给出:
8192    f
1073741825      f
相关:如何测试是否支持稀疏文件 如果我要存储一堆小文件怎么办? 一些可能性是: 使用数据库而不是文件系统:数据库与文件系统存储 使用支持块子分配的文件系统 参考书目: https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files https://askubuntu.com/questions/641900/how-file-system-block-size-works 在Ubuntu 16.04中测试。     
因为默认情况下du会提供磁盘使用率,该磁盘使用率等于或大于文件大小。如--apparent-size所述
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be
larger due to holes in (`sparse\') files, internal fragmentation, indirect blocks, and the like
    
比较(例如)
du -bm
du -m
-b
设定
--apparent-size --block-size=1
, 但是
m
会覆盖块大小为
1M
-bh
-h
类似:
-bh
表示
--apparent-size --block-size=1 --human-readable
,again35再次覆盖该块大小。     
文件和文件夹的实际大小和磁盘大小 --apparent-size是文件或文件夹的实际大小 磁盘大小是文件或文件夹在磁盘上占用的字节数。 使用du时也一样 如果遇到的表观大小几乎总是比磁盘使用率高几个数量级,那么这意味着您有很多(“稀疏”)文件带有内部碎片或间接块的文件。     

要回复问题请先登录注册