人们为什么使用tarball?


90

作为主要的Windows开发人员,也许我在Linux社区中缺少一些文化性的东西,但是它始终使我感到困惑。

下载文件时,首先将文件放入.tar存档,然后将其压缩。为什么要分两步走?压缩无法实现文件分组吗?还有其他我不知道的好处吗?


3
通常,您只需将压缩和文件分组结合到一个命令中即可。tar -zcf file.tar.gz一些文件名
JuhaSyrjälä08年

1
没有人提到以1字节大小传输1000000个文件比以1000000字节大小传输1个文件更昂贵。
Milo LaMar

Answers:


137

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

* nix哲学是可以很好地完成特定工作并且可以链接在一起的小型工具之一。这就是为什么这里有两个具有特定任务的工具,它们被设计为可以很好地结合在一起的原因。这也意味着你可以使用tar来组文件,然后你有一个压缩工具(的选择bzipgzip等等)。


2
回答得更快,而且比我好一些-猜猜我会再去工作!
哈珀·谢尔比

9
我击败了您4分钟,那是堆栈溢出时间的永恒。:-)
斯图尔特·约翰逊

1
值得注意的是,tar和gzip本身都是有用的,这就是它们分开的原因。通过巧妙地使用管道,我曾经通过在SSH上解压缩,压缩和管道化将文件夹从一台计算机移动到另一台计算机,然后在目标位置解压缩和解压缩。一条命令,没有临时文件。
rmeador

1
您也可以说,他们坚持使用已经证明有效的方法,而不是改变事情和破坏兼容性。就像所谓的现代工具和技术一样,.tar.gz可以在一个步骤中完成(请注册WinZip)。
JeeBee

2
我不敢相信没有人编辑过这个问题,也没有留下评论提及(imo)使用tar归档文件的全部要点:Linux文件系统权限支持。如果您下载了Debian软件包,并由软件包管理器安装了该软件包,但是没有可执行文件是可执行文件,将会发生什么情况?这就是每个人都使用tarball 的真正原因...;)
JamesTheAwesomeDude13年

28

一个重要的区别是这两种档案的性质。

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

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

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


感谢您区分zip和tar + gzip!
路加福音

1
+1用于区分“压缩聚合文件”和“聚合压缩文件”。
杰西·奇斯霍尔姆

另一方面,焦油具有更好的压缩比,而拉链更具弹性的原因可以解释为,焦油是一种固体压缩,而拉链不是固体。
令人称奇的

@Barry,所以总之,谁赢了?(假设我们使用的是现代操作系统)
Pacerier's

@Pacerier我认为没有任何胜利。邮政编码更适合随机访问以及供Windows上的人们使用。在Linux和Unix上,Tarball具有更高的即装兼容性。Tarball的压缩率略高,但是您需要对整个内容进行解压缩才能访问任何内容。两者都支持任意压缩算法,但与tarball混合和匹配要容易得多。根据目标,两者可能会更好。
巴里·凯利

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),然后使用选择的压缩器(一次,首选压缩器是pack,后来compress更受欢迎了(比pack),然后gzip与它的前任一起运行,并且与它完全竞争zip(已移植到Unix,但不是本地的),而bzip2以我的经验,现在通常比UNIX 具有10-20%的优势gzip

[ 补充:有人在回答中指出他们cpio有有趣的约定。没错,但是当您不希望归档给定目录下的所有内容时,直到GNU tar获得相关选项(' -T -')cpio才是更好的命令-您实际上可以准确选择要归档的文件。缺点cpio是您不仅可以选择文件,还必须选择它们。仍然有一个地方cpio得分。它可以从一个目录层次结构到另一个目录层次结构进行原位复制,而无需任何中间存储:

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

顺便说一句,“ -depth”选项find在这种情况下很重要-在设置目录本身的权限之前,它先复制目录的内容。在输入此答案的附加内容之前,当我检查命令时,我复制了一些只读目录(555权限)。当我删除副本时,必须先放松目录的权限,然后rm -fr /new/place才能完成“ ”。如果没有该-depth选项,该cpio命令将失败。我只是在进行清理时才记住这一点-引用的公式对我来说是自动的(主要是由于多年来的多次重复)。]


扩展的ZIP格式可以容纳与TAR一样多的插件式流压缩器,但是如果没有合适的IPC协议,由于子流程的执行过多,它可能会变慢。
巴里·凯利

我的goto命令:tar -xfvz tarpkg.tar.gz(将z替换为bz2压缩档案的aj)
Bryan Rehbein

1
@Redbeard:tar在提取时自动检测gzip和bzip2 -要进行创建,您必须告诉它要做什么,但是我只使用-xf(或-xvf)和tar文件名。
乔纳森·勒夫勒

15

有趣的是,您可以得到tarand 的创建者无法预期的行为gzip。例如,您不仅可以gzip压缩tar文件,还可以tar gzip压缩文件以生成一个files.gz.tar(从技术上讲,这更接近pkzip工作方式)。或者,您可以将另一个程序(例如某些加密)放入管道中,并可以选择任意的打包,压缩和加密顺序。编写密码程序的人不必丝毫知道如何使用他的程序,他要做的就是从标准输入中读取并写入标准输出。


生成文件时,请记住在压缩后而不是在加密之前进行加密,因为加密输出看起来是随机的并且很难压缩。
Jonathan Leffler 2014年

8

在Unix世界中,大多数应用程序被设计为做一件事情,并且做得很好。Unix中最流行的zip实用程序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
实际上,反之亦然:zip是现在在Windows中构建的,因为它在DOS和Windows的早期版本中很普遍。
Christian Lescuyer

我喜欢在Windows上使用RAR,在Linux上使用tar.bz2
Osama Al-Maadeed

您可能会注意到奇怪的(与getopt()不兼容)选项解析,并且连字符是可选的,因为tar早于Unix命令选项的标准约定。
乔纳森·勒夫勒

5

我认为您正在寻找与此相关的更多历史背景。原始zip文件用于单个文件。Tar用于将多个文件放到一个文件中。因此,去皮和拉皮是两个步骤。为何今天它仍然如此占主导地位?

从Wikipedia中获取Tar_(文件格式)

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


4

tar是UNIX,因为UNIX是tar

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

仔细研究创建归档文件所涉及的各个阶段,希望您会同意,这里分离不同任务的方式在最大程度上是UNIX哲学

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

  • 还有另一个任意可互换的工具(gzip bz2 xz仅举几个例子),它将任何输入字节流转换成另一个(希望是)较小的输出流。

使用这种方法可以为用户和开发人员带来很多好处:

  • 可扩展性 允许对夫妇tar任何现有的压缩算法或任何待开发,但仍压缩算法,而不不必在内部运作改变什么tar都没有。

    全新的“ hyper-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。

  • cpio(外来语法;理论上更一致,但是人们喜欢他们所知道的,tar占了上风)
  • ar(很久以前很流行,现在用于打包库文件)
  • shar(自解压shell脚本,有各种各样的问题;过去一直很流行)
  • zip(由于许可问题,许多Unices上不易获得)

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

显然,tar.gz(或ar.Z)的一个缺点是,您必须解压缩整个档案以提取单个文件并列出档案内容,决不能伤害到足以使他们从tar中大量消失的人们。


tar的旧版本没有标题信息。tar(例如GNU tar)的新(兼容POSIX,USTAR)版本。'file'命令可以理解这一点。
乔纳森·莱夫勒

2

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

ZIP本身和RAR都是这两个过程的组合。


2

通常在* nux世界中,成捆的文件以tarball的形式分发,然后有选择地压缩。Gzip是一个简单的文件压缩程序,它不会像tar或zip那样进行文件捆绑。

一次,zip无法正确处理Unix tar和unix文件系统认为正常的某些事情,例如符号链接,大小写混合的文件等。我不知道是否有所改变,但这就是我们使用tar的原因。


1
* nux-Linux,Unux,Solarnux?
Mackenir

1
@mackenir-不要忘记POSUX。:-)
Paul Tomblin's

1
@mackenir-还是应该是POSNUX?
Paul Tomblin

1

Tar =将文件分组为1个文件

GZip =压缩文件

他们将流程分为2个步骤。仅此而已。

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


3
考虑到OP在Windows中使用的“ zip”文件已经包含了分组,所以这不是最好的解释。
加雷斯

1

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

而且比IMHO拉链更易于使用和便携。


1

在我的Altos-XENIX时代(1982),我们开始使用tar(磁带存档器)从5 1/4软盘或流式磁带中提取文件,然后复制到这些介质上。作为补充,它的功能与DOS 5.0和6.22中的BACKUP.EXE和RESTORE.EXE命令非常相似,允许您在不能仅容纳一种介质的情况下跨越多种介质。缺点是,如果多种媒体之一出现问题,那么整个事情就一文不值。tar和dd源自UNIX系统III,并可能一直是向后兼容的原因,因此仍是类UNIX OS的标准发行实用程序。


0

Tar不仅是文件格式,还是磁带格式。磁带逐位存储数据。每个存储实现都是自定义的。Tar是一种方法,您可以从磁盘上取走数据,然后将其存储到磁带上,这样其他人就可以不用您的自定义程序来检索数据。

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

我相信tar.gz趋势只是继续存在的惯性。Pkzip一开始便同时进行了压缩和归档,但是随后DOS系统通常没有连接磁带机!

来自Wikipedia的Tar_(文件格式)

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


严格来讲tar是一种文件格式-只是在unix磁带上只是另一个文件。
马丁·贝克特

实际上,tar并不是一种文件格式。磁带没有文件系统,因此tar被创建为没有文件系统的补丁。
Kieveli 2009年

0

作为Windows开发人员,可以理解压缩包看起来多么奇怪。这个单词tar代表磁带存档。考虑盘式磁带录音机。

在Windows世界中,通常使用setup.exeinstall.exe来安装程序,该程序可以在注册表中运行各种向导,创建目录并安装.dll(动态链接库)文件。

在Linux(尤其是Ubuntu)中,根据我的经验,程序包管理器通常会在大多数情况下负责应用程序的安装。在Ubuntu中,开发人员创建一个以.deb(Debian,Ubuntu为基础)结尾的包。安装a的基本语法.deb是:

sudo apt install <package_name>

尽管对于用户而言这相对简单,但是开发人员创建.deb包并关联PPA 仍需要大量工作。

对于开发人员来说,更简单的方法是创建一个tarball。然后,安装负担由最终用户分担。他们一定:

  • 下载压缩包(通常以结尾.tar.gz)。
  • 将源代码解压缩到目录。
  • 编译源代码(在Windows for Profit世界中闻所未闻)。
  • 希望写下他们所做的事情,以防将来需要重复,因为没有apt可以备份的数据库(认为Windows已安装程序列表)。

正如已经回答您另一个问题的另一个答案一样,您可以创建一个tarball并同时压缩数据。不需要两次通过过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.