为什么人们使用tarballs?

92
作为一名主要从事Windows开发的开发者,也许我错过了Linux社区中的某些文化因素,但这总是令我感到困惑。
在下载文件时,文件首先被放入一个.tar归档文件,然后再进行压缩。为什么要这样做呢?难道压缩不可以实现文件分组吗?还有其他我不知道的好处吗?

3
通常情况下,您只需要将压缩和文件分组组合为一个命令。tar -zcf file.tar.gz 某些文件名 - Juha Syrjälä
2
没有人提到,传输1000000个大小为1字节的文件比传输一个大小为1000000字节的文件更昂贵。 - Milo LaMar
16个回答

141
bzipgzip只适用于单个文件,而不是多个文件。普通的zip(和pkzip)则可操作多个文件,并内置档案概念。 *nix哲学主张使用专业工具完成特定任务并且这些工具可以相互衔接。因此这里有两种具有特定任务的工具,它们被设计成互补匹配的。这也意味着您可以使用tar来组织文件,然后选择压缩工具(bzipgzip等)。

2
比我回答得更快、更好——我猜我要回去工作了! - Harper Shelby
9
我比你快了四分钟,在 Stack Overflow 的时间里,这简直是一个世纪。 :-) - Stewart Johnson
2
值得注意的是,tar和gzip都有各自的用途,这就是它们被分开的原因。通过巧妙利用管道,我曾经通过打包、压缩和SSH传输将一个文件夹从一台计算机移动到另一台计算机,然后在目标计算机上解压缩和解包。一条命令,无需临时文件。 - rmeador
1
你也可以说他们坚持使用已被证明有效的东西,而不是改变事物并破坏兼容性。.tar.gz 可以像所谓的现代工具和技术一样在一个步骤中完成(请注册 WinZip)。 - JeeBee
4
我难以相信没有人编辑过这个问题,或者留下评论提到使用tar存档的(我认为)整个重点:支持Linux文件系统权限。如果你下载了一个Debian软件包,你的软件包管理器安装了它,但是所有可执行文件都无法执行,那会发生什么?这才是每个人使用tarball的真正原因...;) - JamesTheAwesomeDude
显示剩余7条评论

31

两种不同类型的压缩文件有一个重要区别。

TAR文件实质上只是一些头部信息和文件内容的串联,而gzip和bzip2则是流压缩器,应用于整个串联的tarballs文件中。

ZIP文件是许多经过单独压缩的文件的串联,同时含有一些头部信息。实际上,DEFLATE算法被zip和gzip都采用,通过适当的二进制调整,你可以将gzip流的有效负载放入zip文件中,并加入适当的头部和字典条目。

这意味着这两种不同的归档类型具有不同的权衡。对于大量小文件的集合,TAR后跟流压缩器通常会比ZIP具有更高的压缩比,因为流压缩器将有更多数据来构建其字典频率,从而能够挤出更多的冗余信息。另一方面,ZIP文件中的(保持文件长度的)错误只会破坏那些受到影响的压缩数据文件。通常,流压缩器不能从流的中段有意义地恢复错误。因此,ZIP文件更具有抗损耗性,因为部分归档仍然可以被访问。


感谢您区分zip和tar+gzip之间的差别! - Luke
2
+1 是为了区分“压缩聚合文件”和“聚合压缩文件”。 - Jesse Chisholm
tar 允许更好的压缩比,而 zip 则更具弹性,这是由于 tar 是一种实心压缩,而 zip 是非实心的。 - gaborous
@Barry,所以总的来说谁赢了呢?(假设我们使用现代操作系统) - Pacerier
@Pacerier 我认为没有绝对胜利者。Zip 对于随机访问和在 Windows 上使用更好。Tarballs 在 Linux 和 Unix 上的开箱兼容性更高。Tarballs 稍微具有更高的压缩率,但您需要解压整个文件才能访问任何内容。两者都支持任意压缩算法,但与 tarballs 混合和匹配要容易得多。根据目标,任何一种格式可能更好。 - Barry Kelly

26

很奇怪没有人提到现代版本的GNU tar可以在打包时进行压缩:

tar -czf output.tar.gz directory1 ...

tar -cjf output.tar.bz2 directory2 ...

你也可以使用你选择的压缩器,只要它支持 '-c'(输出到标准输出或从标准输入读取)和'-d'(解压缩)选项:

tar -cf output.tar.xxx --use-compress-program=xxx directory1 ...

这将允许您指定任何替代压缩程序。

[添加:如果您从gzipbzip2压缩文件中提取,GNU tar会自动检测并运行适当的程序。也就是说,您可以使用:

tar -xf output.tar.gz
tar -xf output.tgz        # A synonym for the .tar.gz extension
tar -xf output.tar.bz2

这些将被正确处理。如果您使用非标准压缩程序,则需要在提取时指定。

分离的原因如所选答案中所述,是责任的分离。除其他事项外,这意味着人们可以使用“cpio”程序来打包文件(而不是“tar”),然后使用所选择的压缩程序(曾经,首选的压缩程序是“pack”,后来是比“pack”更有效的“compress”,然后是“gzip”,它完全可以与“zip”竞争(已被移植到Unix,但在那里不是本地程序),现在是“bzip2”,在我的经验中,通常比“gzip”优越10-20%。

[添加:有人在他们的答案中指出,cpio有一些奇怪的约定。这是真的,但在GNU tar获得相关选项(“-T -”)之前,当您不想归档给定目录下面的所有内容时,cpio是更好的命令--您实际上可以选择要存档的确切文件。 cpio的缺点是您不仅可以选择文件--您必须选择它们。 cpio仍然有一个地方可以得分;它可以在没有任何中间存储的情况下从一个目录层次结构复制到另一个目录层次结构中:

cd /old/location; find . -depth -print | cpio -pvdumB /new/place

顺便提一下,在这种情况下,find 上的'-depth'选项非常重要——它会在设置目录权限之前复制目录的内容。当我在输入答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我不得不放松目录的权限,然后'rm -fr /new/place'才能完成。如果没有使用-depth选项,cpio命令将失败。当我去清理时,我才重新记起这一点——这个公式对我来说已经非常自然(主要是因为多年来反复练习)。

一个扩展的ZIP格式可以像TAR一样容纳插件流压缩器,但是如果没有合适的IPC协议,由于过多的子进程exec'ing,它可能会变得更慢。 - Barry Kelly
我的goto命令:tar -xfvz tarpkg.tar.gz(对于bz2压缩的归档文件,请将z替换为j) - Astra
1
@Redbeard:tar 在解压时会自动检测 gzip 和 bzip2 格式,但在创建时需要告诉它具体操作。我通常使用 -xf(或 -xvf)加上 tar 文件名来进行解压操作。 - Jonathan Leffler

15
有趣的是,您可以得到一些未被 targzip 的创建者预料到的行为。例如,您不仅可以对 tar 文件进行 gzip 压缩,还可以对已经压缩过的文件进行打包,生成一个 files.gz.tar 文件(这在技术层面上更接近于 pkzip 的工作方式)。或者您可以将另一个程序放入管道中,例如一些加密程序,并且可以选择任意顺序的打包、压缩和加密操作。编写加密程序的人根本不需要知道他的程序会被如何使用,他只需要从标准输入读取数据,然后将加密结果写入标准输出即可。

生成文件时要记得先压缩后加密,因为加密后的输出看起来很随机,很难进行压缩。 - Jonathan Leffler

9
在Unix世界中,大多数应用程序都被设计为做一件事情,并做得很好。在Unix中最流行的压缩工具gzip和bzip2只负责文件压缩,而tar则负责文件连接。将tar的输出导入到压缩工具中即可完成所需操作,这不会给任何一个软件增加过多复杂性。

7
另一个普及原因是tar和gzip几乎安装在所有*NIX操作系统中。我认为这可能是最大的原因。这也是为什么zip文件在Windows上非常普及,因为支持内置,无论RAR或7z中是否有更好的程序。

GNU tar还允许您通过一个命令(一个步骤)创建/提取这些文件:

  • 创建存档:
  • tar -cfvj destination.tar.bz2 *.files
  • tar -cfvz destination.tar.gz *.files

  • 提取存档:(-C部分是可选的,默认为当前目录)

  • tar -xfvj archive.tar.bz2 -C destination_path
  • tar -xfvz archive.tar.gz -C destination_path

这些都是我从我的多年Linux和最近的Nexenta(OpenSolaris)记忆中记住的。


3
实际上,情况是相反的:现在在Windows中内置了zip,因为它在DOS和早期版本的Windows中很流行。 - Christian Lescuyer
我喜欢在Windows上使用RAR,在Linux上使用tar.bz2。 - Osama Al-Maadeed
你可能已经注意到了奇怪的选项解析方式(不兼容 getopt()),并且由于 tar 早于 Unix 命令选项的标准约定,所以破折号是可选的。 - Jonathan Leffler

5
我认为你更想了解历史背景。原始的zip是单个文件的格式,而tar则用于将多个文件打包成一个文件。因此,打包和压缩是两个步骤。为什么它今天仍然如此占主导地位,任何人都无法确定。
从维基百科中了解 Tar_(file_format)
在计算机中,tar(源自磁带档案)既是一种文件格式(以某种归档比特流的形式)也是处理此类文件所使用的程序的名称。该格式由 POSIX.1-1988 标准化,之后又由 POSIX.1-2001 标准化。最初作为原始格式开发的,用于磁带备份和其他顺序访问设备进行备份,现在通常用于将文件集合整理成一个较大的文件,进行分发或存档,同时保留文件系统信息,例如用户和组权限、日期和目录结构。

4

tar就像UNIX系统一样,UNIX系统就像tar一样

我认为今天仍然使用tar的原因是它是UNIX哲学的杰作,从一开始就完美地实现了不同任务的分离。

仔细观察创建存档所涉及的各个阶段,您会发现这里分离不同任务的方式是UNIX哲学的最佳体现:

  • 一个工具(在这里称为tar)专门用于将任何选择的文件、目录和符号链接,包括所有相关元数据(如时间戳、所有者和权限),转换为一个字节流。

  • 另一个可以任意交换的工具(gzip、bz2、xz等)将任何输入字节流转换为另一个(希望更小的)输出字节流。

采用这种方法为用户和开发人员带来了许多好处:

  • 可扩展性 允许将tar与任何现有的或尚未开发的压缩算法耦合,而无需对tar的内部工作进行任何更改。 一旦全新的“超级zip-utra”或其他压缩工具推出,您已经准备好使用它,利用tar的全部功能。

  • 稳定性 tar从80年代初以来一直在大规模使用,经过了多个操作系统和机器的测试和运行。 在实现存储所有权、权限、时间戳等方面不需要反复发明轮子,不仅节省了开发时间(否则会浪费大量时间),而且为每个新应用程序提供了相同的可靠性。

  • 一致性 用户界面始终保持不变。

    无需记住使用工具A恢复权限时必须传递选项--i-hope-you-rember-this-one,使用工具B时必须使用--this-time-its-another-one,而使用工具C时是`--hope-you-didnt-try-with-tool-as-switch。 而在利用工具D时,如果您没有使用--if-you-had-used-tool-bs-switch-your-files-would-have-been-deleted-now,那么您将真正搞砸它。


3

tar因历史原因而广受欢迎。现在有几种替代品可供选择。其中一些存在的时间与tar几乎一样长,但由于某些原因无法超越tar的流行。

  • cpio(外来语法理论上更加一致,但人们喜欢熟悉的东西,tar占据了主导地位)
  • ar(很久以前很受欢迎,现在用于打包库文件)
  • shar(自解压shell脚本,存在各种问题,但仍然很受欢迎)
  • zip(由于许可证问题,在许多Unix系统上不容易获得)

tar的一个主要优点(和缺点)是它既没有文件头,也没有内容的中央目录。因此多年来它从未受到文件大小限制的影响(直到这个十年,在存档中8 Gb文件的限制成为问题,已经解决多年)。

显然,tar.gz(或者ar.Z)唯一的缺点是你必须解压整个归档才能提取单个文件和列出归档内容,但这从未对足够多的人造成伤害,使他们大量转向其他工具。


旧版本的tar没有头信息;新的(POSIX兼容,USTAR)tar版本(例如GNU tar)有。'file'命令可以理解这一点。 - Jonathan Leffler

2

gzip和bzip2只是压缩软件,而不是打包软件。因此需要结合使用。您需要tar软件来捆绑所有文件。

ZIP本身以及RAR也是这两个过程的组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接