我知道
tar
曾经是用于磁带存档的,但是今天我们有了存档文件格式,该格式既可以聚合文件又可以在同一逻辑文件格式中执行压缩。与使用在相同数据结构中进行聚合和压缩的文件格式相比,使用封装在tar
或gzip
中的bzip2
在聚合/压缩/解压缩阶段是否存在性能损失?假设所比较的压缩器的运行时相同(例如gzip和Deflate相似)。tar
文件格式是否具有其他文件格式(例如.7z
和.zip
)所没有的功能? tar
是这样的旧文件格式,并且今天存在较新的文件格式,为什么今天tar
(无论是封装在gzip
,bzip2
还是新的xz
中)仍然在GNU / Linux,Android,BSD和其他类似UNIX操作上广泛使用系统,用于文件传输,程序源和二进制下载,有时甚至可以作为软件包管理器格式?#1 楼
第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
。 br />现在,让我们解压缩吧!方法1
你有
blah.tar.gz
,一种或另一种方式。 /> gunzip blah.tar.gz
这将
读取q43的1 GB压缩数据内容12079q。
通过内存中的
blah.tar.gz
解压缩器处理压缩的数据。当内存缓冲区中充满了“一块”数据时,将未压缩的数据写入磁盘上的文件
gzip
中,然后重复进行直到所有取消链接(删除)文件
blah.tar
。现在,您的磁盘上有
blah.tar.gz
,该磁盘未经压缩,但其中包含一个或多个文件,数据非常低结构开销。文件大小可能比所有文件数据的总和大几个字节。您运行:
tar xvf blah.tar
此将
阅读2GB的
blah.tar
的未压缩数据内容和blah.tar
文件格式的数据结构,包括有关文件许可权,文件名,目录等的信息。将2 GB的数据以及元数据写入磁盘。这涉及:将数据结构/元数据信息转换为在磁盘上适当地创建新文件和目录,或用新数据内容重写现有文件和目录。是1 GB(用于gunzip)+ 2 GB(用于tar)= 3 GB。 +几个字节的元数据=大约4 GB。
方法2
您有
tar
,一种或另一种方法。 :tar xvzf blah.tar.gz
这将
一次读取一个块
blah.tar.gz
的1 GB压缩数据内容到内存中。通过内存中的
blah.tar.gz
解压缩器处理压缩数据。随着内存缓冲区填满,它将把内存中的数据通过管道传递到
gzip
文件格式解析器,该解析器将读取有关元数据等以及未压缩的文件数据。作为内存单元ffer填入
tar
文件解析器后,它将通过创建文件和目录并将未压缩的内容填充到磁盘中,从而将未压缩的数据写入磁盘。是1 GB的压缩数据,周期。
在此过程中我们写入磁盘的总数据为2 GB的未压缩数据+几个元数据字节=约2 GB。
如果您注意到,方法2中的磁盘I / O数量与
tar
或7-Zip程序执行的磁盘I / O相同,可以调整压缩率的任何差异。如果您要考虑压缩率,请使用
Zip
压缩器封装Xz
,并且您拥有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
13年3月15日在18:22
“第3部分:兼容性”似乎已从@Kruug的答案中复制而来。
–钛诱饵
13年3月17日在2:19
@titaniumdecoy您是否注意到原来是该部分的作者是异体症,并将其编辑为Kruug的答案?
–slhck
13年3月17日在7:50
感谢您指出这一点,我没有注意到。但是,在此页面上在两个不同的答案中包含相同的文本块对我来说似乎有点愚蠢。
–钛诱饵
13 Mar 18 '13 at 0:37
这回答了为什么tar适合归档生态系统(即,将文件聚合在一起,提供性能提升以及权限节省等其他好处)的原因,但是它并没有解决为什么未使用dar等现代替代方法的问题。换句话说,这个答案证明了文件聚合器的使用是合理的,而不是tar软件本身的使用。
–很棒
16年6月2日在13:06
#2 楼
bzip和gzip适用于单个文件,而不适用于文件组。普通的旧zip(和pkzip)可在文件组上运行,并具有内置存档的概念。
* nix原理是可以很好地完成特定工作并且可以链接在一起的小型工具之一。这就是为什么这里有两个具有特定任务的工具,它们被设计为可以很好地结合在一起的原因。这也意味着您可以使用tar对文件进行分组,然后可以选择压缩工具(bzip,gzip等)。 .tar.bz2,因为它是“最低公分母”文件格式:与大多数Windows用户可以访问.zip或.rar解压缩器一样,大多数Linux安装,即使是最基本的安装,也至少可以访问
tar
和gunzip
,无论年龄有多大或减少了多少。 针对运行现代发行版的受众的新项目可能会以更现代的格式很好地发行,例如
.tar.xz
(使用Xz(LZMA)压缩格式,比gzip或bzip2压缩更好) )或.7z,与ZIP或RAR文件格式类似,它既压缩并指定了将多个文件封装为一个文件的布局。您不会看到.7z用于与未从在线下载商店以全新的格式(例如Opus或WebM中的视频)出售音乐的原因相同。与运行古老或非常基本的系统的人的兼容性很重要。
评论
@Kruug,您好,我编辑您的帖子只是为了提供一个实用的角度,说明人们在选择使用其他格式时为什么仍选择使用这些格式。我没有更改您已有的文字。这只是为了确保对这个问题的规范答案似乎具有完整的前景。如果需要,可以随时编辑我的编辑内容:)
– allquixotic
13年3月14日在15:06
@allquixotic的开始有人吗?编辑和编辑,以便您可以编辑...
– SnakeDoc
2013年3月14日15:11
这个答案肯定是“我有时被不当的投票所震撼”的情况。它没有解决问题的核心问题,即列出压缩的tar的内容,甚至不是原始答案!
–ЯрославРахматуллин
13年3月14日在16:08
-1表示正义。这应该是一条评论。
– Wim
13年3月15日在6:53
我不购买传统/最低公分母参数;我记得在新系统(sun)上经常需要下载gzip / gunzip(从sunfreeware)来安装其他tar.gz打包软件(加上gnu tar,因为sun的tar很烂)。对于传统/较低公共分母,您具有tar.Z(压缩/解压缩)。实用程序的发展一直是不断变化和改进的源泉(无双关语):Z => zip => gz => bz2 => 7z => xz(或您喜欢的任何顺序)。至于tar的角色,某些实用程序仅解压缩/压缩,并且仍然需要tar捆绑文件层次结构。
–迈克尔
13年3月15日在8:27
#3 楼
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文件系统进行的操作。
评论
您不需要GNU tar使用任意压缩程序:只需告诉tar使用f将档案写到stdout并将其通过管道传输到压缩程序即可。
–伊尔马里·卡洛宁(Ilmari Karonen)
13年3月15日在17:18
“您是否需要未压缩的数据(为什么?)?”我经常使用tar将文件系统树从一个位置复制到另一个位置并保留权限等,在这种情况下进行压缩只会占用额外的CPU周期。例如。 tar cf-* | tar xf--C / somewhere。
–史蒂夫
14年8月15日在21:42
此外,当目标文件系统执行重复数据删除时,您需要一个.tar文件。在执行重复数据删除的文件系统上创建压缩存档将大大降低重复数据删除率。示例:我们曾经删除了一个$ 10,000.00的tar.gz文件;这意味着,由于有人使用压缩,它占用了价值1万美元的存储空间。
–亚伦
15年1月23日,0:06
对于像LZ4或LZO这样的算法,@ Steve CPU周期可能比磁盘IO便宜。这就是为什么它们在zram和透明压缩文件系统(例如NTFS,ZFS,Btrfs)中使用的原因,因此有时实际上比压缩要快,因为磁盘IO的数量大大减少了
–phuclv
18年7月28日在10:03
#4 楼
您将归档和压缩这两个不同的过程弄混了。 >个文件从一台主机复制到另一台主机。如下所示的命令tar cf - some_directory | ssh host "(cd ~/somewhere | tar xf -)"
可以大大加快速度。如果我知道无法压缩文件,或者通过压缩设置了SSH,则可以节省大量CPU时间。当然,可以使用具有存档功能的更现代的压缩工具
,然后关闭压缩。
tar
的优点是,我希望它可以在每个系统上使用。使用带有gzip压缩的存档器的原因
与
tar
一起使用gzip
是:速度! 用于运输,而不是长期存放。在这些情况下,我使用
gzip
,不会使CPU占用最大内存(例如,与7-Zip相反),
意味着我又被I / O绑定,而不受CPU约束。再说一次:
gzip
可以在任何地方使用。要复制的许多小文件(例如,包含数十万个文件的邮件目录)。 tar
确实很棒,它可能并非在所有地方都可用。此外,仅当目标文件中已经存在部分文件(或更旧的版本)时,scp
才能真正得到回报。对于初始副本,rsync
是最快的(压缩或不压缩),具体取决于实际数据。评论
但是,如果要存档,为什么不也压缩呢?好的,可以为不容易压缩的文件节省时间,但是存档者可能应该知道,例如音乐,除了标头之外,其压缩性不是很高。
– MarcusJ
2013年3月14日15:58
您可能不需要,或者您的内容可能不可压缩。
– Hasturkun
13年3月14日在16:05
出于性能原因,通过超高带宽网络链接发送数据时,使用非压缩文件聚合通常会更容易,而这些带宽超过了压缩器压缩数据的速度。例如,这可以通过千兆以太网来实现。只有少数设计良好的压缩算法(压缩率也很差)才能压缩数据,即使在大型台式机CPU上也是如此。在嵌入式设备上,您可以使用更少的CPU时间。
– allquixotic
13年3月14日在16:38
这不仅可以加快处理速度,还可以保留文件所有权,时间戳和属性(如果用户权限允许的话)
–安德烈·霍尔兹纳(Andre Holzner)
13年3月14日在20:39
@AndreHolzner对。我经常做tar cf-。 | (cd〜/ somewhere; tar xvf-)。不必等到中央索引被写入(例如在zip文件中)就非常有用。
–user239558
13年3月14日在23:30
#5 楼
除了这里的其他好答案之外,我更喜欢tar
+ gzip|bzip2|xz
的组合,主要是因为这些压缩文件就像流一样,并且您可以轻松地通过管道传输它们。对于zip
或rar
格式,我必须先下载然后解压缩。使用tar.{gz,bz2,xz}
,我可以在同一步骤中下载和解压缩,而无需将压缩的存档永久保存在磁盘上:,这样可以加快整个过程的速度,因为我没有时间花在第一次下载整个文件上,下载完成后,我将其解压缩。相反,我正在下载它时解压缩它。您不能对
zip
或rar
文件执行此操作。评论
我对rar不了解(这是一个可怕的程序,由于它能够分解成多个较小的文件而似乎仅在海盗中流行),但是您可以很好地传输zip。手册页甚至提到了它。它还具有能够从大型归档文件的中间有效地提取或更新文件的优点,尽管tar倾向于获得更好的压缩效果。压缩与随机访问是一个折衷。
–psusi
2013年3月14日15:53
@psusi不正确。您可以像这样进行黑客攻击,但是它的作用是将内存中的所有文件下载并解压缩,而不是在下载时解压缩。 funzip只是提取zipfile中的第一个文件,而不是全部。
–卡洛斯·坎德罗斯(CarlosCampderrós)
13年3月14日在16:03
@Stu只是为了澄清,这不是问题,只是在优化您的时间(如果您认为那样,我不在乎空间)
–卡洛斯·坎德罗斯(CarlosCampderrós)
13年3月15日在8:39
双方都可以工作:您可以在一侧放焦油,而在另一侧放焦油:tar zc / some / folder | ssh user @ host“ cd / other /文件夹&& tar zx”
–卡洛斯·坎德罗斯(CarlosCampderrós)
13年3月15日在8:51
我记得从前记得使用@psusi时,它是使用pkzip将文件存储在多个软盘上的,而zip存储目录位于存档末尾。它总是要求最后一张软盘开始提取或显示目录。因此,en.wikipedia.org / wiki / File:ZIP-64_Internal_Layout.svg
– Mikhail Moskalev
2013年3月15日23:06
#6 楼
坚持使用(GNU)Tar的理由很多。它是:
GPL许可的
Unix哲学意义上的
该工具能够完成多项任务
文档齐全,并具有许多受信任的功能
与几种压缩算法兼容
易于使用且人们已经养成习惯
广泛使用
使用RMS启动的软件(不包括Emacs)时,我感到内心温暖而模糊。 tarball才能读取内容,那么您可能是对的。 WinRAR和7-Zip会自动执行此操作。但是,此问题有简单的解决方法,例如以未压缩形式记录存档内容。
评论
它是免费软件-数量很多,而且擅长于其功能-与其他产品相比几乎没有记录。它有充分的文档记录,并具有许多功能-很少使用且易于使用的功能。它支持多种压缩算法-不像其他的那么多
–格里芬
2013年3月14日14:50
Unix神创造了它-因此我们必须使用它!
– SnakeDoc
13年3月14日在15:02
Tar还本地存储UNIX权限,并且众所周知并经过测试。在很多情况下,可能需要将一堆文件打包为单个文件或流,但不一定要压缩它。
–LawrenceC
13年3月14日在15:03
幸运的是,tar不仅限于GNU版本。尽管GNU tar当然是一个很好的软件,但libarchive +相关的前端要更快,更容易嵌入其他软件项目中。您可以为tar争论,而不必将其变成许可斗争。
–卢卡斯·霍尔特(Lucas Holt)
13年3月14日在17:50
我不是在讽刺。我喜欢RMS以及他实现信念的方式。
–ЯрославРахматуллин
13年3月15日在15:45
#7 楼
.zip之类的文件格式要求软件首先读取文件的结尾,以读取文件名的目录。相反,tar将这些信息与压缩流一起存储。 >zip方式的优势在于,对于磁盘上的静态文件,您可以浏览内容和元数据而无需先解压缩整个存档。
两者都有其用途,具体取决于你在做什么。
评论
不,您可以将zip文件作为流从管道中读取和写入到管道中。
–马克·阿德勒
13年3月15日在5:38
那可能是特定于实现的,那么原始pkzip当然不支持它。
–xorsyst
13年3月15日在9:09
是的,必须编写软件来支持它。 zip格式完全支持它,其数据描述符可以跟随压缩数据的长度和CRC。
–马克·阿德勒
13年3月15日在16:51
@MarkAdler,什么软件? Infozip不支持从管道解压缩。
–psusi
13年3月16日在1:16
zlib.net/sunzip033.c.gz
–马克·阿德勒
13年3月16日在6:04
#8 楼
似乎有些不愿直接回答您所有问题的方法,似乎倾向于使用您的问题作为对症下药的起点。因此,我来做个尝试。 ,与使用在同一数据结构中进行汇总和压缩的文件格式进行比较时?不。实际上,由于tar和gzip通常是两个进程,因此您甚至可以获得诸如Info-ZIP的zip之类的存档程序无法提供的多核速度优势。在压缩率方面,tar + gzip通常比使用deflate的zip明显好得多,因为前者可以受益于文件之间的相关性,而后者可以分别压缩文件。压缩的好处转化为提取时的速度好处,因为压缩程度更高的存档文件在更少的时间内解压缩。是的,tar是为Unix设计的,并且经过多年的发展能够精确记录和恢复每个奇特的小角落和Unix文件系统的裂缝,甚至是新手和老手Mac OS X Unix文件系统。 zip能够保留许多元数据,例如权限,时间,所有者,组和符号链接,但仍然不能全部保留。举例来说,zip和7z都无法识别或利用稀疏文件,也不知道或无法还原硬链接。如今存在着更新的文件格式
,为什么tar(无论是封装在gzip,bzip2甚至是新的
xz中)还是在GNU / Linux,Android,BSD和其他操作系统上如此广泛地使用? >这样的UNIX操作系统,用于文件传输,程序源和二进制下载,有时甚至可以作为程序包管理器格式?最好的是它可以正常工作,并且您可以继续将其更新为更好的压缩格式(例如xz),并且仍然使用相同的tar格式甚至编译后的tar实用程序。如果您只想打包一堆东西,然后在另一端将它们全部解包,那么除了那里最古老,最完整,最调试的软件之一之外,几乎没有理由使用任何东西。 />
如果您想要随机访问,部分更新或其他需要零碎处理内容的事情,或者希望能够在不读取全部内容的情况下找到其中的内容,那么您将使用其他格式。
评论
CW代表Community Wiki。另请参阅什么是“社区Wiki”帖子?
–ctype.h
13 Mar 18 '13 at 0:47
我猜是CW,因为问题有15个以上的答案。当您发布此答案时,因为它是15号,所以该问题和所有答案都标记为CW。
–ctype.h
13年3月18日在0:56
除了直接引用问题(我写的是BTW,是因为问题的原始修订版本太恐怖了,以至于可以像NARQ一样被关闭),我看不到这个答案是怎么说的,其他答案都没有。不错的尝试。
– allquixotic
13年3月20日在14:02
嗯好无论您想怎么想都可以。您的答案或任何其他答案似乎都在解决是否存在性能损失。您的答案没有解决明显的压缩差异,尽管其他人也这样做。由于您实际上没有解决性能问题(您的性能部分实际上与工作流程有关,而与性能无关),因此没有其他答案可以在一处回答所有问题。有趣的是,您编写了性能损失问题,但没有回答!去搞清楚。
–马克·阿德勒
13年3月21日在0:26
顺便说一句,您的工作流程讨论是没有人做过的事情,那就是将tar文件写入磁盘,然后压缩它。始终使用tar直接调用压缩程序,或直接将其插入压缩程序的管道中。
–马克·阿德勒
13年3月21日在0:27
#9 楼
性能最大的不同是压缩和归档的完成顺序。
tar
存档,然后可以选择将存档发送到压缩器,而zip
建立存档,并压缩文件数据。将32 KB的大块插入到存档中。通过将文件数据分成小块并分别进行压缩,它使您可以提取特定文件或文件的某些部分,而不必先解压缩存档中的所有内容。它还可以防止压缩器在重新启动之前建立非常大的词典。这意味着压缩将更快,但与使用较大的字典大小压缩整个对象相比,压缩率却不如预期。您可以通过考虑两个文件(其中前500个字节为第二个文件与第一个文件的后500个字节相同。使用
zip
方法,压缩器将针对第二个文件重新启动,因此不记得第一个文件以相同的数据结尾,因此无法从第二个文件中删除重复的数据。流行性
还有许多其他格式比
tar
具有许多优势。 7-Zip不存储Unix文件权限,但是dar
可以存储,而zip
可以,并且所有三个都存储一个索引,该索引允许快速浏览,提取文件的子集以及更新存档中的文件。他们还可以使用多核CPU进行压缩。每个人仍然使用
tar
的原因与每个人仍然使用Windows和Flash的原因相同:人们不喜欢更改。没有强大的改变理由,人们只会坚持自己所知道的。当大多数人已经安装了dar
且很少了解tar
时,dar
并不能提供足够的好处来证明以该格式发布文件是合理的,因此简单的惯性使我们保持在旧标准上。评论
zip可以存储和恢复Unix权限。通常随Unix系统一起分发的InfoZIP的zip和unzip实用程序可以执行此操作。
–马克·阿德勒
13年3月15日在5:33
zip不会以32K块压缩文件。您将32K的滑动窗口大小与压缩方式混淆了。
–马克·阿德勒
13年3月15日在5:35
gzip -9没有900 kB字典。 gzip的所有级别都使用32K词典。您可能正在考虑bzip2。
–马克·阿德勒
13年3月15日在5:36
在一个答案中有如此多的错误信息。
–马克·阿德勒
13年3月15日在5:37
您需要对答案进行更正或删除答案。
–马克·阿德勒
13年3月16日在6:47
#10 楼
创建Tar是为了对文件系统进行备份全保真备份,而不仅仅是为了传输文件。因此,tar实用程序是用于创建归档文件的最完整的实用程序,该归档文件保留了有关文件系统结构的所有重要信息。 >文件所有权
文件权限
不太常见的文件权限(例如setuid,粘性位)
符号链接
硬链接
设备条目(即字符和块设备)
稀疏文件
ACL条目(并非所有版本都支持)
SElinux标签(不是支持所有版本)
还具有
--one-file-system
选项,该选项在进行备份时非常有用。首先(甚至排他)。因此,它仍然是保存文件的最兼容方式。评论
这个答案是唯一有意义的答案。谢谢您的发布。
–很棒
16年2月2日在13:02
#11 楼
今天,我们有很多压缩文件,包括MP3,JPG,视频,tar.gz文件,JAR包,RPM,DEB等。如果您需要将一堆文件打包到一个文件中进行传输,那么拥有一个“ tar”实用程序会很有用,该实用程序仅打包文件而不尝试压缩它们。尝试压缩压缩文件不仅浪费时间和电力,而且经常导致文件大于原始文件。
另一种用法是为了提高压缩率。例如,如果您先“压缩”一堆日志文件,然后对结果进行gzip压缩,则可能会得到比先压缩然后再与“ tar”捆绑在一起的文件小的文件。当然,使用tar,您可以选择所需的任何压缩算法,并指定用于针对特定用例优化压缩的选项。使用ZIP。在我们的办公室中,每个装有Windows的人都安装了7-zip,因此,对于我们来说,tar文件是完全跨平台兼容的。
评论
您几乎从未见过未压缩的tar文件,这是有原因的。 tar使用非常大的块,这意味着在文件末尾会有很多填充。要摆脱所有这些零,几乎总是需要使用gzip而无需三思而后行。
–基督徒
13年3月16日在14:28
一个有趣的例外是,出于明显的原因,gzip源代码可以以裸露的tar形式提供。
–马克·阿德勒
13 Mar 18 '13 at 0:32
#12 楼
也许我们应该想知道为什么这样的“新”文件格式既执行压缩又进行聚合(并且我会添加加密),而不是从一开始就没有在tar上构建而是使用完全不同的工具。是历史原因(与操作系统历史,专利“保护”,软件供应商销售工具的能力等有关)。解决方案,并且在其他方面(例如在流上工作或Unix权限管理的能力)上可能更好。这篇文章承认了tar的一些缺点...但是不建议使用zip(真正的zip格式不能解决这些缺点),但是DAR。以前,我不得不创建一种文件格式来存储加密数据。使用tar作为基础很方便(其他人做出了相同的选择,例如tar是.deb软件包的内部聚合格式)。对我来说显而易见的是,在加密之后尝试压缩数据完全没有用,在加密之前我不得不执行压缩作为一个独立的步骤,而且我要么都不准备使用zip加密(我想要使用公钥和私钥对两个密钥进行加密) 。使用tar可以轻松实现。#13 楼
令我惊讶的是,没有人提到这一点,但是原因之一(不是真正的优势,而是必要)是向后兼容。数十年来,有许多系统运行着软件,这些软件可能会调用tar
进行归档。雇用某人“修复”所有旧系统并不划算。#14 楼
tar是UNIX,就像UNIX是tar我认为今天仍然使用
tar
的原因是,这是UNIX方法从一开始就完全正确的(可能很少)情况之一。 仔细研究创建归档文件所涉及的各个阶段,我希望您能同意,在这里完成不同任务的方式是UNIX最好的哲学:
一个工具(
tar
在这里给它一个名字)专门用于将任何选择的文件,目录和符号链接转换为一个字节流,包括时间戳,所有者和权限等所有相关元数据。还有另一个可以任意互换的工具(仅举几个选项),它将任何输入字节流转换为另一个(希望是)较小的输出流。 使用这种方法为用户和开发人员带来了很多好处:
可扩展性
将
gzip
与现有的任何压缩算法或尚待开发的任何压缩算法结合在一起,而无需根本改变bz2
的内部功能。 zip-utra”或其他压缩工具问世,您已经准备好使用xz
的强大功能来拥抱您的新仆人。 稳定性
tar
自80年代初期开始进行测试,并已在许多操作系统和机器上运行。 避免为每一个新的归档工具一遍又一遍地实现存储所有权,权限,时间戳等的重复工作,不仅节省了很多(否则不必要的)开发时间,而且还为每个新应用程序保证了相同的可靠性。
一致性用户界面始终保持不变。
无需记住,要使用工具A还原权限,您必须传递选项
tar
,而使用工具B则必须使用tar
,而使用工具C时,它是“-希望您用工具切换开关尝试” 。 使用工具D时,如果您不使用
tar
,您真的会搞砸它。 #15 楼
很多好的答案,但他们都忽略了一个重要的事实。 Tar在类似Unix的世界中拥有完善的用户和开发者生态系统。就像它的DOS / Windows生态系统使ZIP不断发展一样,这使它继续发展。拥有这样一个生态系统才是支撑技术而不是技术优势的原因。评论
真的很好的评论,我什至没有想到,这是一个非常好的观点。
– MarcusJ
13年3月19日在21:17
#16 楼
原因是“文化根深蒂固”。像我这样的许多人,如果要求他们处理压缩的tar归档文件或偶尔的ZIP(如果它来自Windows世界)之外的其他东西,它们的眼睛就会瞪着。听听7-Zip,RAR或其他信息。如果我必须安装一个程序来解压缩文件,那就可以了。如果导致付款给我,或者内容是我“必须拥有”的东西,并且无法以其他任何方式使用,我会这样做。某人一个压缩包,它立即被识别。接收者可以使用肌肉记忆键入提取命令。真正的问题是:为什么有些人如此着迷于节省更多的字节空间,以至于他们要求其他人浪费时间安装一些奇特的工具,学习如何使用它?然后还有奇特的使用外来压缩和存档格式的情况。具有AAC声音的H.264视频是否真的需要放入多部分的RAR中?
tar格式可能很旧,但是它存储了所有相关内容:文件内容,路径,时间戳,权限和所有权。它不仅存储符号链接,而且可以保留硬链接结构。它还存储特殊文件,因此磁带存档可用于在引导过程中使用的微型
/dev
目录。您可以将一个Linux发行版放在一起,其二进制软件包格式什么都不包含,但是压缩包相对于文件系统根目录是未压缩的。评论
关于“是如此着迷” ...想象您被困在战区中,只有一台硬化的笔记本电脑,而超小的20G硬盘几乎快满了,也许还有Gig,并且听到远处的枪声,您真的想浏览一张100MB的.PDF手册,其中显示了如何维修吉普车,但该文件位于2 Gig .tgz文件中。而且笔记本电脑运行的是封闭的,奇怪的专有操作系统,并且您没有root权限来删除系统文件,这显然是如何删除4G +而不破坏dearchiver或PDF查看器的。如果您可以提取该100MB文件...
–agc
16年6月2日在4:40
#17 楼
直接回答您提出的特定问题:在
聚合/压缩/解压缩阶段,使用封装在gzip或bzip2中的tar
是否会降低性能,与使用在同一数据结构中进行聚合和压缩的文件格式进行比较时? br />
通常情况下,使用
tar
可以显着提高性能,尤其是内置的压缩库(tar xvzf
或tar xvjf
样式的命令行,其中使用压缩库而不是第二个)处理)。这有两个主要原因:在处理大量相对较小的文件时,尤其是在分发软件中常用的文件时,具有很高的冗余度。与对单个文件进行压缩相比,对许多文件进行压缩导致更高的整体压缩率。而且“字典”是针对每个输入块而不是每个文件计算一次。tar
理解文件系统。它旨在保存和恢复可运行/可运行的操作系统。它深刻地把握了UNIX文件系统上重要的内容,并忠实地捕获并还原了它。其他工具...并非总是如此,尤其是zip系列,它更适合在一系列操作系统之间共享文件,在这些操作系统中,文档是重要的,而不是忠实的操作系统敏感副本。 br /> tar文件格式是否具有其他文件格式(例如.7z和.zip)没有的功能?稀疏文件处理。一些直接数据库库依赖于稀疏文件-这些文件名义上的数据为GB,但是写入和存储的实际数据却少得多,并且实际上只使用了几块磁盘。如果使用不知道的工具,则在解压缩时,最终会消耗大量磁盘块,所有磁盘块都包含零。将其转换为稀疏文件是很痛苦的。如果您有足够的空间来做。您需要一个掌握什么是稀疏文件并尊重它的工具。
元数据。多年来,Unix演变了一些奇怪的事情。 14个字符文件名,长文件名,链接符号链接,粘性位,超级用户位,继承的组访问权限等。Tar理解并复制了这些内容。文件共享工具……不多。许多人不会以他们可能的方式使用链接...如果您曾经使用过使用链接的软件,然后使用了不知名的工具进行备份和还原,那么现在您将拥有很多独立文件,而不是具有多个名称的单个文件。疼痛。您的软件出现故障,并且磁盘膨胀。 bzip2甚至是新的
xz)至今仍在GNU / Linux,Android,BSD和其他
UNIX操作系统上如此广泛地用于文件传输,程序源和
二进制下载,有时甚至作为包管理器格式?
tar
工作正常。它完成了它专为设计的工作。还有其他吹捧的替代品(cpio
,pax
等)。但是tar几乎安装在所有东西上,由于其他原因,它使用的压缩库也很常见。没有什么能比tar更好的了。没有明显的优势,并且社区中有大量的嵌入式使用和知识,因此没有替代品。多年来,Tar的用途很多。如果我们在思考文件系统或非文本文件的方式上发生了重大变化,从而以某种方式成为传输代码的方式(当前无法想象如何,但是可以忽略……),那么您可以找到另一种工具。但这不是我们现在使用的操作系统的类型。这是完全不同的事情,组织方式不同,并且需要自己的工具。最重要的问题是,您没有问过,什么是“ tar”病-适合。
压缩后的
tar
易碎。您需要一点点的整个存档。以我的经验,它没有弹性。我遇到了一点错误,导致多部分存档变得不可用。它不会引入冗余来防止错误(这将解决您提出的有关数据压缩的问题之一)。如果存在数据损坏的可能性,那么您需要进行冗余冗余的错误检查,以便可以重建数据。根据定义,这意味着您没有被最大程度地压缩。你们既不能拥有所需要的每一个数据并承载其含义的最大值(最大压缩),又不能拥有每一个数据的丢失和恢复(冗余和纠错)能力。那么...存档的目的是什么? tar
非常适合在高可靠性环境中使用,并且可以再次从源文件中复制档案。 IME,实际上,它的名字暗示的原始东西更糟-磁带归档。磁带上的单个位错误(或更糟糕的是,磁带头上的单个位错误,在整个磁带或存档中,每个字节丢失一位)导致数据变得无法使用。借助足够的冗余以及错误检测和纠正,您可以解决这些问题中的任何一个。 ......您正在查看的环境中有多少噪音和损坏,并且可以使用源来重新生成失败的存档吗?根据您提供的线索,答案是系统不嘈杂,并且源能够重新生成档案。在这种情况下,
tar
就足够了。具有压缩功能的
tar
也不能与预压缩文件一起正常播放。如果您要发送已压缩的数据,则只需使用tar,而不必担心压缩阶段-只是增加了CPU周期而已。这意味着您确实需要知道发送的内容以及原因。如果你在意。如果您不关心这些特殊情况,那么tar会忠实地复制数据,而compress会忠实地对减小数据大小没有帮助。除了一些CPU周期外,没什么大问题。
评论
我不同意它“浪费时间”。如果您的意思是性能,那么由于tar格式非常有效,因此不会对tar造成实际性能损失。如果您的意思是浪费时间,我看不出tar xvzf比7z -x难吗...他似乎在为tar在开始时不存储目录这一事实而感到遗憾,因此想要在提取之前列出内容的gui压缩工具必须解压缩整个tar才列出内容,然后在提取时再次对其进行解压缩。
@MarcusJ:您认为7z以某种方式神奇地知道了档案中每个文件的起始位置?此外,通常的压缩算法(gzip,bzip2)可用于流式传输内容:无需在下一阶段之前完成第一阶段的100%操作。
同样,@MarcusJ似乎让您混淆了两个不同的事物:执行tar xvzf时,未压缩的数据不会以.tar格式写入硬盘!没错,如果先运行gunzip blah.tar.gz,然后运行tar xf blah.tar,它将两次将数据写入磁盘(一次是.tar,一次是文件系统中的文件),但实际上没有人这样做那样。 tar xzf使用UNIX管道(基本上是内存副本)将未压缩的数据从gzip(或任何压缩程序)传输到tar,因此数据不会以.tar格式写入磁盘。
我知道的一件事是,当涉及到数据损坏时,tar(尤其是压缩的)表现得很糟糕。现代格式添加的少量冗余/恢复数据值得金币