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

时间:2009-01-30 20:05:07

标签: archive tar unix

我有一个我正在存档的目录:

$ 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文件小于它的内容?

5 个答案:

答案 0 :(得分:38)

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

简而言之,您的磁盘是由群集组成的。每个群集的固定大小 - 比方说 - 4千字节。如果您在此类群集中存储1kb文件,则3kb将不使用。具体细节因您使用的文件系统类型而异,但大多数文件系统都以这种方式工作。

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

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

答案 1 :(得分:4)

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

答案 2 :(得分: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的整个块。有些文件系统可以避免block suballocation的空间浪费。

答案 3 :(得分:2)

有两种可能性。

小文件

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

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

稀疏文件

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

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

答案 4 :(得分:0)

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