今天使用“ tar”有什么好处?


209

我知道这tar是过去用于磁带存档的,但是今天我们有了存档文件格式,该格式既可以聚合文件,又可以在同一逻辑文件格式中执行压缩。

问题:

  • 与使用在同一数据结构中进行聚合和压缩的文件格式相比,在使用或中tar封装时,在聚合/压缩/解压缩阶段是否会降低性能?假设所比较的压缩器的运行时间相同(例如gzip和Deflate相似)。gzipbzip2

  • 是否有tar其他文件格式(例如.7z和).zip所没有的文件格式功能?

  • 由于tar文件格式如此之旧,而如今却存在较新的文件格式,为什么文件tar(无论是封装在gzipbzip2还是新版本中xz)在GNU / Linux,Android,BSD和其他类似UNIX操作系统上仍然如此广泛地用于文件传输,程序源和二进制下载,有时甚至是软件包管理器格式?


33
我不同意它“浪费时间”。如果您是指性能,那么由于tar格式非常有效,因此不会对tar造成实际的性能损失。如果你的意思是浪费你的时间,我看不出tar xvzf是不是更难7z -x
allquixotic

41
他似乎在为tar在开始时不存储目录这一事实而感到遗憾,因此想要在提取之前列出内容的gui压缩工具必须解压缩整个tar才列出内容,然后在提取时再次对其进行解压缩。
psusi 2013年

10
@MarcusJ:您认为7z以某种方式神奇地知道了档案中每个文件的起始位置?此外,通常的压缩算法(gzip,bzip2)可用于流式传输内容:无需在下一阶段的第一阶段完成100%的操作。
souser12345

11
还有@MarcusJ,您似乎会混淆两个不同的事物:执行此操作时tar xvzf,未压缩的数据不会.tar格式写入硬盘!你说的没错,如果你跑了gunzip blah.tar.gz,然后tar xf blah.tar,将数据写入到磁盘两次(一次为.tar,再次为文件系统中的文件),但没有人真正做这种方式。在tar xzf使用UNIX管(基本上存储器复制),以从传输未压缩数据gzip(或任何压缩机)到tar,所以该数据不是在写入磁盘.tar格式。
allquixotic

14
我知道的一件事是,tar(特别是压缩的)数据损坏方面表现不佳。现代格式添加的少量冗余/恢复数据值得金
PPC 2013年

Answers:


178

第1部分:效果

这是两个单独的工作流程及其作用的比较。

您的磁盘上有一个文件,blah.tar.gz即1 GB的gzip压缩数据,如果未压缩,则占用2 GB(因此压缩率为50%)。

如果要分别进行归档和压缩,则创建此方法的方式将是:

tar cf blah.tar files ...

这将导致未压缩形式的blah.tar聚集files ...

那你会做

gzip blah.tar

blah.tar将从磁盘读取内容,通过gzip压缩算法将其压缩,将内容写入blah.tar.gz,然后取消链接(删除)文件blah.tar

现在,让我们解压缩!

方式1

您有blah.tar.gz一种或另一种方式。

您决定运行:

gunzip blah.tar.gz

这将

  • 读取的1 GB压缩数据内容blah.tar.gz
  • 通过gzip内存中的解压缩器处理压缩数据。
  • 当内存缓冲区中充满了“一块”数据时,将未压缩的数据写到blah.tar磁盘上的文件中,然后重复进行直到读取所有压缩的数据为止。
  • 取消链接(删除)文件blah.tar.gz

现在,您blah.tar在磁盘上,该磁盘未经压缩,但其中包含一个或多个文件,而数据结构的开销却非常低。文件大小可能比所有文件数据的总和大几个字节

你跑:

tar xvf blah.tar

这将

  • 读取2 GB的未压缩数据内容blah.tartar文件格式的数据结构,包括有关文件许可权,文件名,目录等的信息。
  • 将2 GB数据和元数据写入磁盘。这涉及:将数据结构/元数据信息转换为在磁盘上适当地创建新文件和目录,或者用新数据内容重写现有文件和目录。

在此过程中,我们从磁盘读取的总数据为1 GB(对于gunzip)+ 2 GB(对于tar)= 3 GB。

在此过程中,我们写入磁盘的总数据为2 GB(对于gunzip)+ 2 GB(对于tar)+元数据的几个字节=大约4 GB。

方式二

您有blah.tar.gz一种或另一种方式。

您决定运行:

tar xvzf blah.tar.gz

这将

  • 一次读取blah.tar.gz一个块的1 GB压缩数据内容到内存中。
  • 通过gzip内存中的解压缩器处理压缩数据。
  • 当内存缓冲区填满时,它将把内存中的数据通过管道传递到tar文件格式解析器,后者将读取有关元数据等的信息以及未压缩的文件数据。
  • 当内存缓冲区填充到tar文件解析器中时,它将通过创建文件和目录并用未压缩的内容填充将未压缩的数据写入磁盘。

在此过程中,我们从磁盘读取的总数据为1 GB压缩数据。

在此过程中,我们写入磁盘的总数据为2 GB的未压缩数据+元数据的几个字节=约2 GB。

如果您注意到,方法2中的磁盘I / O数量与例如or或7-Zip程序执行的磁盘I / O 相同,可以调整压缩率的任何差异。Zip

而且,如果您要考虑压缩率,请使用Xz压缩器进行封装tar,您将拥有LZMA2的 TAR存档,该存档的效率与7-Zip可用的最先进的算法一样高效:-)

第2部分:功能

tar 将Unix权限存储在其文件元数据中,并且众所周知并且已经成功地通过各种不同的权限,符号链接等对目录进行了打包测试。在许多情况下,可能需要遍历一堆文件压缩到单个文件或流中,但不一定要压缩它(尽管压缩是有用且经常使用的)。

第3部分:兼容性

许多工具以.tar.gz或.tar.bz2的源代码或二进制格式分发,因为它是“最低公分母”文件格式:与大多数Windows用户可以访问.zip或.rar解压缩器一样,大多数Linux安装也是如此。 ,即使是最基本的版本,无论年龄多大或缩减,都至少可以访问tar和gunzip。甚至Android固件也可以使用这些工具。

针对运行现代发行版的受众的新项目可能会以更现代的格式发行,例如.tar.xz(使用Xz(LZMA)压缩格式,比gzip或bzip2更好地压缩)或.7z,类似于ZIP或RAR文件格式,因为它既压缩又指定了用于将多个文件封装为单个文件的布局。

您不会看到.7z的使用频率更高,其原因与在线下载商店中未以Opus等新格式或WebM中的视频出售音乐的原因相同。与运行古老或非常基本的系统的人的兼容性。


对于所有内容都分隔在三个不同标题下的问题,我们给予了很好的答复。
JFW

2
“第3部分:兼容性”似乎已从@Kruug的答案中复制而来。
titaniumdecoy

23
@titaniumdecoy您是否注意到原来是该部分的作者,并把它编辑成克鲁格的答案?
slhck

2
感谢您指出这一点,我没有注意到。但是,在此页面上在两个不同的答案中包含相同的文本块对我来说似乎有点愚蠢。
titaniumdecoy

1
这回答了为什么tar适合归档生态系统(即,将文件聚合在一起,提供性能提升以及节省权限等其他好处)的原因,但是它并没有解决为什么dar没有采用现代替代方案的原因。换句话说,这个答案证明了文件聚合器的使用是合理的,而不是tar软件本身的使用。
令人赞叹的

101

已经在Stack Overflow上得到了解答

bzip和gzip适用于单个文件,而不适用于文件组。普通的旧zip(和pkzip)在文件组上运行,并具有内置存档的概念。

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

许多工具以.tar.gz或.tar.bz2的源代码或二进制形式分发,因为它是“最低公分母”文件格式:与大多数Windows用户可以访问.zip或.rar解压缩器一样,大多数Linux安装也是如此。 ,即使是最基础的,也无论年龄多大或缩减,都至少可以使用targunzip。甚至Android固件也可以使用这些工具。

针对运行现代发行版的受众的新项目可能会以更现代的格式发行,例如.tar.xz(使用Xz(LZMA)压缩格式,其压缩效果比gzip或bzip2更好)或.7z(与ZIPRAR类似)文件格式,它既压缩又指定用于将多个文件封装为单个文件的布局。

您不会看到.7z的使用频率更高,其原因与在线下载商店中未以Opus等新格式或WebM中的视频出售音乐的原因相同。与运行古老或非常基本的系统的人的兼容性很重要。


7
@Kruug,您好,我编辑了您的文章只是为了提供一个实用的观点,说明为什么人们在选择使用其他格式时仍然选择使用这些格式。我没有更改您已有的文字。这只是为了确保对这个问题的规范答案似乎具有完整的前景。如果需要,可以随时编辑我的编辑内容:)
allquixotic 2013年

5
@allquixotic的开始有人吗?编辑和编辑,以便您可以编辑...
SnakeDoc 2013年

21
这个答案肯定是“我有时被不当的投票所震撼”的情况。它没有解决问题的核心问题,即列出压缩的tar的内容,甚至不是原始答案!
ЯрославРахматуллин

5
-1表示正义。这应该是一条评论。
2013年

6
我不购买传统/最低公分母参数;我记得在新系统(sun)上经常不得不下载gzip / gunzip(从sunfreeware)只是为了安装其他tar.gz打包软件(加上gnu tar,因为sun的tar很烂)。对于旧式/较低公共分母,您拥有tar.Z(压缩/解压缩)。实用程序的发展一直是不断变化和改进的动力(无双关语):Z => zip => gz => bz2 => 7z => xz(或您喜欢的任何顺序)。至于tar的角色,某些实用程序仅解压缩/压缩,并且仍然需要tar捆绑文件层次结构。
迈克尔

63

Tar具有丰富的操作和修饰符集,它们都了解Unix文件系统。它了解Unix权限,与文件关联的不同时间,硬链接,软链接(以及符号链接可能在文件系统图中引入循环的可能性),并允许您指定几种不同的方式来管理所有这些数据。

  • 您是否希望提取的数据保留文件访问时间?Tar可以做到。要保留权限?Tar可以做到。

  • 您是否要将符号链接保留为符号链接?Tar默认情况下会这样做。要复制目标吗?Tar可以做到。

  • 您是否要确保硬链接数据仅存储一次(即做正确的事)?Tar做到了。

  • 您想很好地处理稀疏文件吗?Tar可以做到。

  • 您是否需要未压缩的数据(为什么?)?Tar可以做到。要用gzip压缩?Tar可以做到。使用bzip2吗?Tar可以做到。使用任意外部压缩程序?Tar可以做到。

  • 您要写入原始设备还是从原始设备恢复?Tar的格式可以处理得很好。

  • 您想将文件添加到现有档案吗?Tar可以做到。要比较两个存档,看看有什么变化?Tar可以做到。要仅更新存档中已更改的那些部分?Tar可以做到。

  • 您是否要确保不会跨多个文件系统进行归档?Tar可以做到。

  • 您是否只想获取比上次备份新的文件?Tar可以做到。

  • 您要保留用户名和组名或号码吗?Tar可以做任何一个。

  • 您是否需要保留设备节点(如中的文件/dev),以便提取后系统可以正常运行?Tar可以做到。

几十年来,Tar一直在发展以处理大量用例,并且确实对人们想对Unix文件系统做的事情了解很多


12
您不需要GNU tar使用任意压缩程序:只需告诉tar将存档写入stdout f -并将其通过管道传输到压缩程序即可。
Ilmari Karonen

3
“您是否需要未压缩的数据(为什么?)?” 我tar经常将文件系统树从一个位置复制到另一个位置并保留权限等,在这种情况下进行压缩只会占用额外的CPU周期。例如tar cf - * | tar xf - -C /somewhere
史蒂夫

1
此外,当目标文件系统执行重复数据删除时,您需要一个.tar文件。在执行重复数据删除的文件系统上创建压缩存档将大大降低重复数据删除率。示例:我们曾经删除了一个$ 10,000.00的tar.gz文件;意思是,由于有人使用压缩,它占用了价值1万美元的存储空间。
亚伦

对于像LZ4或LZO这样的算法,@ Steve CPU周期可能比磁盘IO便宜。这就是为什么它们在zram和透明压缩文件系统(例如NTFS,ZFS,Btrfs)中使用的原因,因此有时实际上比压缩要快,因为磁盘IO的数量大大减少了
phuclv

30

您混淆了归档压缩这两个不同的过程。

使用存档器的原因

使用归档而不进行压缩的一个原因是,例如,如果将一堆文件从一台主机复制到另一台主机。如下命令

tar cf - some_directory | ssh host "(cd ~/somewhere | tar xf -)"

可以大大加快速度。如果我知道无法压缩文件或使用压缩设置了SSH,则可以节省大量CPU时间。当然,可以使用具有归档功能的更现代的压缩工具,然后关闭压缩功能。优点tar是,我可以期望它在每个系统上都可用。

在gzip压缩中使用存档器的原因

我使用的一个原因targzip是:速度! 如果我要将一些GiB文本文件从一个位置传输到另一个位置,则我不关心挤出最后一个字节,因为压缩仅用于传输,而不用于长期存储。在这些情况下,我使用gzip,不会占用CPU最多的内存(例如,与7-Zip相比),这意味着我再次受I / O约束,而不受CPU约束。再说一次:gzip可以认为到处都有。

理由使用tar赞成scprsync等等。

这可难倒了scp,如果你有大量的小文件拷贝(例如邮件目录有几十万的文件)。rsync棒极了,可能并非到处都有。此外,rsync只有在目标中已经存在部分文件(或较旧版本)的情况下,才真正获得回报。对于初始副本tar,有或无压缩(取决于实际数据)是最快的。


1
但是,如果要存档,为什么不也压缩呢?好的,可以为不容易压缩的文件节省时间,但是存档者可能应该知道,例如音乐,头文件除外,不是很可压缩。
MarcusJ 2013年

2
您可能不需要,或者您的内容可能不可压缩。
Hasturkun

4
出于性能原因,通过超高带宽网络链接发送数据时,使用非压缩文件聚合通常会更容易,而这些带宽超过了压缩器可以压缩数据的速度。例如,这可以通过千兆以太网来实现。只有少数精心设计的压缩算法(压缩率也很差)才能压缩数据,即使在大型台式机CPU上也是如此。在嵌入式设备上,您需要更少的CPU时间。
allquixotic

3
这不仅加快了工作速度,而且还允许保留文件所有权,时间戳和属性(如果用户权限允许的话)
Andre Holzner 2013年

3
@AndreHolzner对。我经常这样做tar cf - . | (cd ~/somewhere; tar xvf -)。不必等到中央索引被写入(例如在zip文件中)就非常有用。
user239558 2013年

24

除了这里的其他好答案之外,我更喜欢组合tar+,gzip|bzip2|xz主要是因为这些压缩文件就像流一样,您可以轻松地通过管道传输它们。

我需要解压缩Internet上可用的文件。使用ziprar格式时,我必须先下载然后解压缩。通过这种方式,tar.{gz,bz2,xz}我可以在同一步骤中下载和解压缩,而无需将压缩的存档永久保存在磁盘上:

curl -s http://example.com/some_compressed_file.tar.gz | tar zx

这将仅将未压缩的文件保留在磁盘中,并会加快整个过程,因为我没有时间花在第一次下载整个文件上,而是在下载完成后我将其解压缩。相反,我正在下载它时解压缩它。您不能使用ziprar文件执行此操作。


2
我对rar不了解(这是一个可怕的程序,由于它能够分解成多个较小的文件而似乎仅在海盗中流行),但是您可以很好地传输zip。手册页甚至提到了它。它还具有能够从大型归档文件的中间有效地提取或更新文件的优点,尽管tar倾向于获得更好的压缩效果。压缩与随机访问是一个折衷。
psusi 2013年

3
@psusi不正确。您可以像这样进行破解,但是要做的是下载内存中的所有文件,然后将其解压缩,而不是在下载时解压缩。而funzip刚刚在提取的zip文件的第一个文件,不是全部。
卡洛斯·坎德罗斯(CarlosCampderrós)

2
@Stu只是为了澄清,这不是问题,只是在优化您的时间(如果您认为那样,我不在乎空间)
CarlosCampderrós2013年

1
双方都可以工作:您可以一侧tar zc /some/folder | ssh user@host "cd /other/folder && tar zx"

1
我记得从前记得使用@psusi时,它是使用pkzip将文件存储在多个软盘上的,而zip存储目录则位于存档末尾。它总是要求最后一张软盘开始提取或显示目录。因此en.wikipedia.org/wiki/File:ZIP-64_Internal_Layout.svg
Mikhail Moskalev 2013年

13

坚持使用(GNU)Tar的理由很多。

它是:

  • GPL许可
  • Unix哲学意义上的好
    • 单一目的的工具,能够完成多项任务
  • 有据可查并具有许多值得信赖的功能
  • 与多种压缩算法兼容
  • 易于使用,人们已经养成习惯
  • 广泛可用
  • 使用RMS(不包括Emacs启动的软件时,我内部感到温暖而模糊

如果您的特定牛肉必须在读取内容之前必须先对其进行“解压缩”,那么您可能是对的。WinRAR7-Zip会自动执行此操作。但是,对于此问题有简单的解决方法,例如以未压缩的形式记录存档的内容。


1
它是一种免费软件-用途很多-擅长于其功能-很难与其他产品相比它有充分的文档证明并具有许多功能-几乎不使用且易于使用的功能。它支持多种压缩算法-没有像很多一些人
格里芬

4
Unix神创造了它-因此我们必须使用它!
SnakeDoc

28
Tar还本地存储UNIX权限,并且众所周知并经过测试。在很多情况下,可能需要将一堆文件打包为单个文件或流,但不一定要压缩它。
LawrenceC

3
幸运的是,tar不仅限于GNU版本。尽管GNU tar当然是一个很好的软件,但libarchive +相关的前端要更快,更容易嵌入到其他软件项目中。您可以为tar争论,而不必将其变成许可斗争。
卢卡斯·霍尔特

1
我没有讽刺。我喜欢RMS以及他实现信念的方式。
ЯрославРахматуллин

11

.zip 之类的文件格式要求软件首先读取文件结尾,以读取文件名目录。相反,tar将信息与压缩流一起存储。

tar方法的优点是您可以解压缩数据,同时从诸如网络套接字之类的不可寻求管道中读取数据。

zip方式的优势在于,对于磁盘上的静态文件,您可以浏览内容和元数据,而无需先解压缩整个存档。

两者都有其用途,取决于您在做什么。


5
不,您可以将zip文件作为流从管道中读取和写入到管道中。
Mark Adler

那可能是特定于实现的,那么原始pkzip当然不支持它。
xorsyst

1
是的,必须编写支持该软件的软件。zip格式完全支持它,其数据描述符可以跟随压缩数据的长度和CRC。
Mark Adler

@MarkAdler,什么软件?Infozip不支持从管道解压缩。
psusi


11

似乎不愿直接回答您的所有问题,显然倾向于使用您的问题作为对症下药的起点。因此,我会尝试一下。

与使用在同一数据结构中进行聚合和压缩的文件格式相比,使用在gzip或bzip2中封装的tar在聚合/压缩/解压缩阶段会降低性能吗?假设被比较的压缩器的运行时间是相同的(例如gzip和Deflate相似)。

不会。事实上,由于tar和gzip通常是两个进程,因此您甚至可以获得诸如Info-ZIP的zip之类的存档程序无法提供的多核速度优势。在压缩率方面,tar + gzip通常比使用deflate的zip明显更好,因为前者可以受益于文件之间的相关性,而后者可以分别压缩文件。压缩的好处转化为提取时的速度好处,因为压缩程度更高的档案在更少的时间内解压缩。

tar文件格式是否具有其他文件格式(例如.7z和.zip)没有的功能?

是的,tar是为Unix设计的,并且经过多年的发展,能够准确地记录和恢复Unix文件系统的每一个奇怪的细节,甚至是更新,更肮脏的Mac OS X Unix文件系统。zip能够保留许多元数据,例如权限,时间,所有者,组和符号链接,但仍然不能全部保留。例如,zip和7z均无法识别或利用稀疏文件,也无法识别或恢复硬链接。

由于tar是一种较旧的文件格式,并且今天存在较新的文件格式,所以为什么tar(无论是封装在gzip,bzip2还是新的xz中)在当今仍在GNU / Linux,Android,BSD和其他类似UNIX上如此广泛地使用操作系统,用于文件传输,程序源和二进制下载,有时甚至是程序包管理器格式?

这里还有很多其他好的答案。最好的是它可以正常工作,并且您可以继续将其更新为更好的压缩格式(例如xz),并且仍然使用相同的tar格式,甚至使用相同的已编译tar实用程序。如果您只想打包一堆东西,然后在另一端将它们全部解包,那么除了那里最古老,最完整,最调试的软件之一外,几乎没有理由使用任何东西。

如果您需要随机访问,部分更新或其他需要零碎处理的内容,或者您​​希望能够在不读取全部内容的情况下找到其中的内容,那么您将希望使用其他格式。


CW代表Community Wiki。另请参阅什么是“社区Wiki”帖子?
ctype.h

我猜是CW,因为问题有15个以上的答案。当您发布此答案时,因为它是15号,所以该问题和所有答案都标记为CW。
ctype.h

除了直接引用问题(我写的是BTW,是因为问题的原始修订版本太恐怖了,以至于可以像NARQ一样被关闭),我看不到这个答案是怎么说的,其他答案都没有。不错的尝试。
allquixotic

嗯好 无论您想怎么想都可以。您的答案或其他任何答案似乎都在解决是否存在性能损失。您的答案没有解决明显的压缩差异,尽管其他人也这样做。由于您实际上没有解决性能问题(您的性能部分实际上与工作流程有关,而与性能无关),因此没有其他答案可以在一处解决所有问题。有趣的是,您编写了性能损失问题,但没有回答!去搞清楚。
Mark Adler

顺便说一句,您的工作流程讨论是关于没有人做过的事情,那就是将tar文件写入磁盘,然后对其进行压缩。总是使用tar来直接调用压缩程序,或直接将其插入到压缩程序的管道中。
Mark Adler

11

性能

最大的区别是压缩和归档在存档中进行的顺序tar,然后可以选择将存档发送到压缩器,然后zip构建存档,并在将文件数据插入存档时以32 KB的块压缩。通过将文件数据分成小块并分别压缩,可以提取特定文件或文件的某些部分,而不必先解压缩存档中的所有内容。它还可以防止压缩器在重新启动之前建立非常大的词典。这意味着压缩将更快,但不会像使用较大的字典大小来压缩整个对象那样提供良好的比率。

您可以通过考虑两个文件来可视化它,其中第二个文件的前500个字节与第一个文件的后500个字节相同。使用该zip方法,压缩器将针对第二个文件重新启动,因此不记得第一个文件以相同的数据结尾,因此无法从第二个文件中删除重复的数据。

人气度

与相比,还有许多其他格式具有许多优势tar7-Zip不存储Unix文件许可权,但dar确实zip可以存储三个索引,并且可以存储索引,从而可以快速浏览,提取文件的子集并更新档案中的文件。他们还可以使用多核CPU进行压缩。

每个人仍然使用tar的原因与每个人仍然使用Windows和Flash的原因相同:人们不喜欢更改。没有强烈的改变理由,人们只会坚持自己所知道的。dar当大多数人已经tar安装时,并没有提供足够的好处来证明以该格式发布文件,而且很少有人知道dar,因此简单的惯性使我们保持了旧标准。


2
zip可以存储和恢复Unix权限。通常随Unix系统一起分发的InfoZIP的zip和unzip实用程序可以执行此操作。
Mark Adler

3
zip不会以32K块压缩文件。您将32K的滑动窗口大小与压缩方式混淆了。
马克·阿德勒

1
gzip -9没有900 kB字典。gzip的所有级别都使用32K词典。您可能正在考虑bzip2。
Mark Adler

在一个答案中有如此多的错误信息。
Mark Adler

1
您需要对答案进行更正或删除答案。
Mark Adler

7

Tar的创建是为了对文件系统进行全保真备份,而不仅仅是为了传输文件。这样,tar实用程序是用于创建归档文件的最完整的实用程序,该归档文件保留了有关文件系统结构的所有重要信息。

这包括一个或多个竞争工具中缺少的所有这些功能:

  • 文件所有权
  • 文件权限
  • 不太常见的文件权限(例如setuid,粘性位)
  • 符号链接
  • 硬链接
  • 设备条目(即字符设备和块设备)
  • 稀疏文件
  • ACL条目(并非所有版本都支持
  • 扩展/用户属性(并非所有版本都支持
  • SElinux标签(并非所有版本都支持

它还具有--one-file-system进行备份时非常有用的选项。

每当将新功能添加到文件系统时,tar首先就会添加支持(甚至独占添加)。因此,它仍然是保存文件的最兼容方式。


这个答案是唯一有意义的答案。谢谢您的发布。
令人赞叹的

5

今天,我们有很多压缩文件,包括MP3,JPG,视频,tar.gz文件,JAR包,RPM,DEB等。如果您需要将一堆文件捆绑到一个文件中进行传输,那么拥有一个“ tar”实用程序会很有用,该实用程序仅捆绑文件而不尝试压缩它们。

尝试压缩压缩文件不仅浪费时间和电力,而且通常会导致文件大于原始文件。

它的另一个用途是提高压缩率。例如,如果您先“压缩”一堆日志文件,然后对结果进行gzip压缩,则可能会得到比先压缩然后再与“ tar”捆绑在一起的文件小的文件。当然,使用tar,您可以选择所需的任何压缩算法,并指定选项以针对特定用例优化压缩。

我发现tar'与今天非常相关,我更喜欢使用ZIP。在我们的办公室中,每个装有Windows的人都安装了7-zip,因此,对于我们来说,tar文件是完全跨平台兼容的。


您几乎从未见过未压缩的tar文件,这是有原因的。tar使用非常大的块,这意味着在文件末尾会有很多填充。要摆脱所有这些零,几乎总是gzip值得在不考虑的情况下使用它。
基督教徒

一个有趣的例外是,出于明显的原因,gzip源代码可以以裸露的tar形式提供。
Mark Adler

4

也许我们应该想知道,为什么这种“新的”文件格式既执行压缩又进行聚合(我将添加加密),却从一开始就没有在tar上构建,而是从完全不同的工具开始构建。

据我了解,有历史原因(与操作系统历史,专利“保护”,软件供应商销售工具的能力等有关)。

现在,正如其他回应所指出的那样,即使现在tar也不明显比其他解决方案逊色,并且在其他方​​面(例如在流上工作或Unix权限管理的能力)可能更好。

如果您阅读有关tar的维基百科文章,则可以看到另一个有趣的事实。本文承认了tar的一些缺点 ...但是不建议使用zip(真正的zip格式不能解决这些缺点),而是建议使用DAR。

我将以个人风格结束。以前,我不得不创建一种文件格式来存储加密数据。使用tar作为基础很方便(其他人也选择了相同的选择,例如tar是.deb软件包的内部聚合格式)。对我来说显而易见的是,在加密之后尝试压缩数据完全没有用,在加密之前我不得不执行压缩作为独立的步骤,而且我要么都不准备使用zip加密(我想要使用公钥和私钥对两个密钥进行加密) 。使用焦油,轻而易举。


3

我很惊讶没有人提到这一点,但是原因之一不是向后兼容,而并不是真正的优势,而是必要。数十年来,有许多运行软件的系统可能需要tar归档。雇用某人“修复”所有旧系统并不划算。


3

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在类似Unix的世界中拥有完善的用户和开发人员生态系统。就像它的DOS / Windows生态系统使ZIP一直在前进一样,这使它继续前进。拥有这样的生态系统才是支撑技术的动力,而不是技术优势。


真的很好的评论,我什至没有想到,这是一个非常好的观点。
MarcusJ 2013年

3

原因是“文化根深蒂固”。像我这样的许多人,如果要求他们处理压缩的tar归档文件或偶尔的ZIP(如果它来自Windows世界)以外的任何东西,它们的眼睛就会闪闪发光。

我不想听到有关7-Zip,RAR或其他任何内容的消息。如果我必须安装一个程序来解压缩文件,那就可以了。如果导致付款给我,或者内容是我“必须拥有”的东西,并且无法以其他任何方式使用,则我将这样做。

tar的一个优点是,如果您向某人发送tarball,它会立即被识别。接收者可以使用肌肉记忆键入提取命令。

真正的问题是:为什么有些人如此着迷于节省更多的字节空间,以至于他们要求其他人浪费时间安装一些奇特的实用程序并学习如何使用它?然后还有奇特的使用外来压缩和存档格式的情况。具有AAC声音的H.264视频是否真的需要放入多部分RAR中?

tar格式可能很旧,但是它存储了所有相关内容:文件内容,路径,时间戳,权限和所有权。它不仅存储符号链接,而且可以保留硬链接结构。它还存储特殊文件,因此磁带存档可/dev用于引导过程中使用的微型目录之类的东西。您可以将Linux发行版放在一起,其二进制软件包格式仅包含相对于文件系统根目录未压缩的tar包。


关于“是如此着迷” ...想象您被困在战区中,只有一台硬化的笔记本电脑,而超小的20G硬盘几乎快满了,也许还有Gig,并且听到远处的枪声,您真的很想浏览一部100MB的.PDF手册,其中显示了如何维修吉普车,但该文件位于2 Gig .tgz文件中。而且笔记本电脑运行的是封闭的,奇怪的专有操作系统,并且您没有root权限来删除系统文件,这显然是如何删除4G +而不破坏dearchiver或PDF查看器。如果您能提取那100MB的文件……
AGC 2016年

2

直接回答您提出的特定问题:

与使用在同一数据结构中进行聚合和压缩的文件格式相比,使用在gzip或bzip2中封装的tar在聚合/压缩/解压缩阶段会降低性能吗?假设被比较的压缩器的运行时间是相同的(例如gzip和Deflate相似)。

在一般情况下,tar特别是与内置的压缩​​库一起使用时,可以实现特定的性能改进(the tar xvzftar xvjfstyle命令行,其中使用压缩库而不是第二个过程)。这有两个主要原因:

  • 当处理大量相对较小的文件时,尤其是在分发软件中常用的文件时,具有很高的冗余度。与对单个文件进行压缩相比,对许多文件进行压缩导致更高的整体压缩率。而且“字典”对于每个输入块(而不是每个文件)只计算一次。

  • tar了解文件系统。它旨在保存和恢复可运行/可运行的操作系统。它精确地掌握了UNIX文件系统上重要的内容,并忠实地捕获和还原了它。其他工具...并非总是如此,尤其是zip系列,它是为在一系列操作系统之间共享文件而设计的,而zip系列更重要,因为文档是重要的,而不是忠实的OS敏感副本。

tar文件格式是否具有其他文件格式(例如.7z和.zip)没有的功能?

稀疏文件处理。一些直接的数据库库依赖于稀疏文件-这些文件名义上的数据为GB,但是写入和存储的实际数据却少得多,并且实际上只使用了几块磁盘。如果使用不知道的工具,则在解压缩时,最终会消耗大量磁盘块,所有磁盘块都包含零。将其转换为稀疏文件是很痛苦的。如果您有足够的空间来做。您需要一个工具来掌握什么是稀疏文件并尊重它。

元数据。多年来,Unix演变了一些奇怪的事情。14个字符文件名,长文件名,链接符号链接,粘性位,超级用户位,继承的组访问权限等。Tar理解并复制了这些内容。文件共享工具……不多。许多人不会以他们可能的方式使用链接...如果您曾经使用过使用链接的软件,然后又使用了不知名的工具进行备份和还原,那么现在您将拥有许多独立的工具。文件,而不是具有多个名称的单个文件。疼痛。您的软件失败,并且磁盘膨胀。

由于tar是一种较旧的文件格式,并且今天存在较新的文件格式,所以为什么tar(无论是封装在gzip,bzip2还是新的xz中)在当今仍在GNU / Linux,Android,BSD和其他类似UNIX上如此广泛地使用操作系统,用于文件传输,程序源和二进制下载,有时甚至是程序包管理器格式?

tar作品。它可以完成它设计的工作。还有其他的吹捧替代(cpiopax,等,等)。但是tar几乎安装在所有东西上,由于其他原因,它使用的压缩库也很常见。没有其他事情能比tar做得更好。没有明显的优势,并且社区中有大量的嵌入式使用和知识,因此没有替代品。多年来,Tar的用途很多。如果我们在思考文件系统或非文本文件的方式上发生了重大变化,从而以某种方式成为传输代码的方式(当前无法想象如何,但是可以忽略……),那么您可以找到另一种工具。但这不是我们现在使用的操作系统的类型。这将是另一回事,组织方式不同,并且需要自己的工具。

我认为,您没有问过的最重要的问题是“ tar”不适合什么工作。

tar压缩很脆弱。您需要一点点的整个存档。以我的经验,它没有弹性。我发生了一点点错误,导致多部分存档变得不可用。它不会引入冗余来防止错误(这将避免您提出的有关数据压缩的问题之一)。如果存在数据损坏的可能性,那么您需要进行冗余的错误检查,以便您可以重建数据。根据定义,这意味着您没有被最大程度地压缩。您不能同时拥有所需的每一个数据位并携带其含义的最大值(最大压缩率),又不能使每一位数据都能够丢失和恢复(冗余和纠错)。那么...存档的目的是什么?tar在高可靠性环境中以及当可以再次从源中复制档案时非常有用。IME,实际上,它的名字所暗示的原始东西更糟-磁带归档。磁带上的单个位错误(或更糟的是,磁带头上的单个位错误,在整个磁带或存档中,每个字节丢失一位)导致数据变得无法使用。借助足够的冗余以及错误检测和纠正,您可以解决这些问题中的任何一个。

那么...您正在查看的环境中有多少噪音和损坏?该源可以用来重新生成失败的存档吗?根据您提供的线索,答案是系统不嘈杂,并且该来源能够重新生成档案。在这种情况下,tar就足够了。

tar压缩也不适用于预压缩的文件。如果要发送已经压缩的数据,则只需使用tar,而不必理会压缩阶段-只是增加了CPU周期而已。这意味着您确实需要知道发送的内容以及原因。如果你在意。如果您不关心这些特殊情况,那么tar会忠实地复制数据,而compress会忠实地无法做很多有用的事以减小数据量。除了一些CPU周期外,没什么大问题。


-3

TAR是磁带存档。它已经存在了数十年,并且得到了广泛的使用和支持。它是一种成熟的产品,可以满足当前需求和遗留需求。

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.