为什么人们使用tarball?

时间:2008-11-17 15:25:50

标签: linux package archive

作为一名主要的Windows开发人员,也许我在Linux社区中遗漏了一些文化,但它总是让我感到困惑。

下载文件首先放入.tar存档的内容时,压缩。为什么两步过程? 压缩不实现文件分组吗?还有其他一些我不知道的好处吗?

16 个答案:

答案 0 :(得分:133)

bzipgzip处理单个文件,而不是文件组。普通旧zip(和pkzip)对文件组进行操作,并具有内置存档的概念。

* nix哲学是能够很好地完成特定工作并且可以链接在一起的小工具之一。这就是为什么这里有两个具有特定任务的工具,它们的设计非常适合。这也意味着您可以使用tar对文件进行分组,然后您可以选择压缩工具(bzipgzip等)。

答案 1 :(得分:28)

一个重要的区别在于两种档案的性质。

TAR文件只是文件内容与某些标题的串联,而gzip和bzip2是流压缩程序,在tarball中应用于整个连接。

ZIP文件是单独压缩文件的串联,带有一些标题。实际上,zip和gzip都使用DEFLATE算法,并且通过适当的二进制调整,您可以获取gzip流的有效负载并将其放入带有相应头和词典条目的zip文件中。

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

答案 2 :(得分:26)

奇怪的是,没有人提到现代版本的GNU tar允许你在捆绑时进行压缩:

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

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

如果它支持'-c'(对stdout,或从stdin)和'-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),然后使用选择的压缩器(曾经一度,首选的压缩器是{ {1}},后来它是pack(比compress更有效),然后pack围绕它的两个前辈发出响应,并且与{{1}完全竞争(已移植到Unix,但不是原生的),现在gzip,根据我的经验,它通常比zip有10-20%的优势。

[添加:有人在答案中注明bzip2有一些有趣的约定。这是真的,但是在GNU gzip获得相关选项('cpio')之前,当您不想存档给定目录下的所有内容时,tar是更好的命令 - 您实际上可以准确选择归档的文件。 -T -的缺点是你不仅可以选择文件 - 你来选择它们。还有一个地方cpio得分;它可以从一个目录层次结构进行原位复制,而无需任何中间存储:

cpio

顺便提一下,cpio上的{cd /old/location; find . -depth -print | cpio -pvdumB /new/place 选项在此上下文中很重要 - 它在设置目录本身的权限之前复制目录的内容。当我在输入此答案之前检查命令时,我复制了一些只读目录(555权限);当我去删除副本时,我必须在'-depth'完成之前放松对目录的权限。如果没有find选项,rm -fr /new/place命令将失败。当我去做清理工作时,我只记得这个 - 引用的公式对我来说是自动的(主要是凭借多年的重复次数)。 ]

答案 3 :(得分:15)

有趣的是,您可以获得targzip的创作者未预料到的行为。例如,您不仅可以gzip tar文件,还可以tar gzipped文件,以生成files.gz.tar(这在技术上更接近pkzip的工作方式)。或者你可以将另一个程序放入管道,例如一些加密,你可以选择任意顺序的tarring,gzipping和encrypting。编写密码学程序的人不必知道如何使用他的程序,他需要做的就是从标准输入读取并写入标准输出。

答案 4 :(得分:8)

在Unix世界中,大多数应用程序都是为了做一件事,而且做得很好。 Unix,gzip和bzip2中最流行的zip工具只进行文件压缩。 tar执行文件串联。将tar输出管道化为压缩实用程序可以满足需要,而不会给任何一个软件增加过多的复杂性。

答案 5 :(得分: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)上的记忆。

答案 6 :(得分:5)

我认为你正在寻找更多的历史背景。原始zip是单个文件。 Tar用于将多个文件放入单个文件中。因此,tarring和zipping是两个步骤。为什么今天仍然如此占主导地位是任何人的猜测。

来自维基百科Tar_ (file_format)

  

在计算中,tar(源自磁带归档)既是文件格式(以存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初开发为原始格式,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,用于分发或存档,同时保留文件系统信息,如用户和组权限,日期和目录结构。

答案 7 :(得分:4)

tar是UNIX,因为UNIX是tar

在我看来,仍然今天使用tar的原因是它是(可能很少见的)UNIX方法从一开始就完全正确的情况之一。 / p>

仔细研究创建档案所涉及的各个阶段,我希望你们同意这里分离不同任务的方式是 UNIX哲学

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

  • 只是另一个可任意互换的工具(gzip bz2 xz,仅举几个选项),将任意输入的字节流转换为另一个(希望)较小的输出流。

使用此类方法可为用户和开发人员带来一系列好处:

  • <强>扩展 允许将tar与已经存在的任何压缩算法或任何压缩算法结合起来但尚未开发,而不必更改任何内容tar的内部运作方式。

    一旦全新的“hyper-zip-utra”或whater压缩工具问世,你就已经准备好用tar的全部力量来拥抱你的新仆人。

  • <强>稳定性 自从80年代早期测试并在大量操作系统和机器上运行以来,tar一直在大量使用。

    每次新归档时,无需重新发明强制实施存储所有权,权限,时间戳等一遍又一遍工具不仅可以节省大量(否则不必要的)开发时间,而且还可以保证每个新应用程序具有相同的可靠性

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

    没有必要记住要使用工具A恢复权限,你必须传递选项--i-hope-you-rember-this-one并使用工具B,你必须使用工具C时使用--this-time-its-another-one它是`--hope-you- didnt-尝试 - 用刀具作为开关。

    如果你没有使用--if-you-had-used-tool-bs-switch-your-files-would-have-been-deleted-now,那么在使用工具D的情况下你会真的搞砸了它。

答案 8 :(得分:3)

tar 主要因历史原因而受欢迎。有几种替代品可供选择。它们中的一些几乎和焦油一样长,但由于几个原因不能超过焦油。

  • cpio(外来语法;理论上更一致,但人们喜欢他们所知道的,焦油占了上风)
  • ar(很久以前流行,现在用于打包库文件)
  • shar(自我提取shell脚本,有各种各样的问题;过去一直很受欢迎)
  • zip(由于许可问题,很多Unices都没有提供)

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

似乎是tar.gz(或者ar.Z)的一个缺点,就是你必须解压缩整个存档以提取单个文件和列出存档内容,从来没有伤害过人们足以让他们从tar中瑕疵很多。

答案 9 :(得分:2)

gzip和bzip2只是一个压缩器,而不是一个归档软件。因此,组合。您需要使用tar软件捆绑所有文件。

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

答案 10 :(得分:2)

通常在* nux世界中,文件包作为tarball分发,然后可选择gzip。 Gzip是一个简单的文件压缩程序,它不执行tar或zip所做的文件捆绑。

曾经有一段时间,zip没有正确处理Unix tar和unix文件系统认为正常的一些事情,比如符号链接,混合大小写文件等等。我不知道是否改变了,但这就是我们使用的原因焦油。

答案 11 :(得分:1)

Tar =将文件分组到1个文件中

GZip =压缩文件

他们将过程分为2.就是这样。

在Windows环境中,您可能更习惯使用执行Zip的WinZip或WinRar。这些软件的Zip过程会对文件和压缩进行分组,但您根本看不到该过程。

答案 12 :(得分:1)

出于同样的原因,为什么mac用户喜欢磁盘映像:它们是一种非常方便的存档方式,然后传递,上传/下载或通过电子邮件发送等等。

比拉链恕我直言更容易使用,更便携。

答案 13 :(得分:1)

在我的Altos-XENIX时代(1982年),我们开始使用tar(磁带归档器)从5 1/4软盘或流式磁带中提取文件以及复制到这些媒体。它的功能非常类似于DOS 5.0和6.22中的BACKUP.EXE和RESTORE.EXE命令作为补充,允许您跨越多个媒体,如果它不能只适合一个。缺点是,如果多媒体中的一个有问题,整个事情就毫无价值。 tar和dd源自UNIX SYstem III,并且由于向后兼容性原因,它仍然是类UNIX操作系统的标准发布实用程序。

答案 14 :(得分:0)

Tar不仅是一种文件格式,而且是一种磁带格式。磁带逐位存储数据。每个存储实现都是自定义的Tar是一种方法,您可以通过该方法从磁盘上获取数据,并将其存储到磁带上,以便其他人可以在没有您自定义程序的情况下检索它。

后来,压缩程序来了,* nix仍然只有一种创建包含多个文件的文件的方法。

我认为这只是惯性,而这种惯性一直伴随着tar.gz的趋势。 Pkzip一下子开始使用压缩和归档,但DOS系统通常没有连接磁带驱动器!

来自维基百科的Tar_(file_format)

  

在计算中,tar(源自磁带归档)既是文件格式(以存档比特流的形式),也是用于处理此类文件的程序的名称。该格式由POSIX.1-1988和后来的POSIX.1-2001标准化。最初开发为原始格式,用于磁带备份和其他顺序访问设备以进行备份,现在通常用于将文件集合整理为一个较大的文件,用于分发或存档,同时保留文件系统信息,如用户和组权限,日期和目录结构。

答案 15 :(得分:0)

作为Windows开发人员, tarballs 看起来很奇怪是可以理解的。单词 $drycleaning = drycleaning::whereHas('carts', function($query) use($cart_id) { $query->where('carts.id', $cart_id); })->get(); 代表磁带存档。想想卷轴式录音机。

在Windows世界中,程序通常安装有tarsetup.exe,它们可以在注册表中使用各种魔法,创建目录并安装install.exe(动态链接库)文件。

在Linux,Ubuntu中,特别是根据我自己的经验,包管理器负责处理应用程序并在大多数时间安装。在Ubuntu中,开发人员创建一个以.dll结尾的包(Debian,Ubuntu所基于的)。安装.deb的基本语法是:

.deb

虽然对于用户来说这是相对简单的,但开发人员要创建sudo apt install <package_name> 包并关联PPA是很多工作。

开发人员更简单的方法是创建tarball。然后最终用户共享安装负担。他们必须:

  • 下载tarball(通常以.deb结尾)。
  • 将源代码解压缩到目录。
  • 编译源代码(在Windows for Profit world中闻所未闻)。
  • 希望写下他们以后需要重复的内容,因为没有.tar.gz数据库(想想Windows安装的程序列表)可以备份。

另一个答案已经说明了你提出的另一个问题,你可以创建一个tarball并同时压缩数据。不需要两遍过程。