24

我有一个要归档的目录:

$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode

所以目录是1.4gb。但是,该文件要小得多:

$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar

只有897mb。它没有以任何方式压缩:

$ file oldcode.tar
oldcode.tar: POSIX tar archive

为什么 tar 文件比它的内容小?

4

5 回答 5

46

由于文件系统的工作方式,您会有所不同。

简而言之,您的磁盘是由集群组成的。每个集群都有一个固定的大小——比如说——4 KB。如果您在这样的集群中存储 1kb 文件,则 3kb 将不会被使用。确切的细节因您使用的文件系统类型而异,但大多数文件系统都是这样工作的。

3kb 浪费的空间对于单个文件来说并不算多,但是如果您有很多非常小的文件,那么浪费可能会成为磁盘使用量的重要组成部分。

在 tar-archive 中,文件不是存储在集群中,而是一个接一个地存储。这就是差异的来源。

于 2009-01-30T20:14:18.273 回答
4

不知道您正在使用什么 tar 或您正在使用什么类型的 Unix 系统,这是我的猜测:oldcode 包含许多较小的文件,当它们本身使用磁盘空间时效率低下,因为磁盘空间是由某种块分配的,而不是逐字节。在 tar 文件中,它们被连接起来,并最大限度地利用分配给它们的磁盘空间。

于 2009-01-30T20:14:29.320 回答
3

这与文件系统的块大小有关。MacOSX 10.5.6 上的man 1 du状态:

du 实用程序显示每个文件参数以及以每个目录参数为根的文件层次结构中的每个目录的文件系统块使用情况。如果未指定文件,则显示以当前目录为根的层次结构的块使用情况。

[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   2 mirko  wheel   68 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K    .

如您所见,即使是 2 字节的文件也需要 4kb 的整个块。有一些文件系统通过块子分配来避免这种空间浪费。

于 2009-01-30T20:33:54.537 回答
3

有2种可能性。

小文件

最有可能的是,它小于其内容。正如 Nils Pipenbrinck 所写du显示文件系统分配的空间量,因为文件存储在文件系统块中,所以大于文件的逻辑大小。

要查看文件的逻辑大小,请使用du --apparent-size. 在这种情况下,结果应该小于 tar 文件。

稀疏文件

tar 文件可以存储稀疏文件。如果 tarball 是使用 创建--sparse的,稀疏文件中的漏洞将被记录,因此 tarball 可能小于文件的逻辑大小。

如果您提取的副本中的稀疏信息以某种方式丢失(例如,如果您将 tarball 提取到不支持稀疏文件的文件系统上,或者如果它被压缩然后解压缩等),那么df将报告扩展大小。

于 2013-01-19T04:39:26.007 回答
0

du 计算磁盘块,而不是文件大小 duder。

于 2009-01-30T20:13:43.673 回答