【问题标题】:Why would a TAR file be smaller than its contents?为什么 TAR 文件会小于其内容?
【发布时间】:2010-10-04 13:33:50
【问题描述】:

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

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

【问题讨论】:

    标签: archive tar unix


    【解决方案1】:

    有两种可能。

    小文件

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

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

    稀疏文件

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

    如果您提取的副本中的稀疏信息不知何故丢失了(例如,如果您将 tarball 提取到不支持稀疏文件的文件系统,或者压缩然后解压缩等),那么df 将报告展开后的尺寸。

    【讨论】:

      【解决方案2】:

      这与文件系统的块大小有关。 MacOSX 10.5.6 上的 ma​​n 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】:

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

          • 非常有意义。我完全忘记了块大小。
          • 与 zip 文件相反,它先压缩,然后存档。
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-02-12
            • 2012-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-11
            • 1970-01-01
            相关资源
            最近更新 更多