今天使用'tar'有什么好处?

Mar*_*usJ 216 linux unix tar archiving

我知道当时tar是为磁带存档制作的,但今天我们有存档文件格式,既可以聚合文件,又可以在相同的逻辑文件格式中执行压缩。

问题:

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

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

  • 既然tar是这样的旧文件格式,以及较新的文件格式存在的今天,为什么tar(无论是封装gzipbzip2甚至是新的xz),今天仍然如此广泛的使用在GNU / Linux,Android的,BSD和其他类似UNIX操作系统,文件传输、程序源和二进制下载,有时甚至作为包管理器格式?

all*_*tic 179

第 1 部分:性能

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

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

如果您要分别进行存档和压缩,则创建此文件的方式将是:

tar cf blah.tar files ...
Run Code Online (Sandbox Code Playgroud)

这将导致blah.tar它只是files ...未压缩形式的聚合。

那么你会做

gzip blah.tar
Run Code Online (Sandbox Code Playgroud)

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

现在,让我们解压!

方式一

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

你决定运行:

gunzip blah.tar.gz
Run Code Online (Sandbox Code Playgroud)

这会

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

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

你跑:

tar xvf blah.tar
Run Code Online (Sandbox Code Playgroud)

这会

  • 读取 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
Run Code Online (Sandbox Code Playgroud)

这会

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

在这个过程中我们从磁盘读取的总数据是 1 GB 的压缩数据,周期。

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

如果您注意到,方式 2 中的磁盘 I/O 量与由7-Zip程序或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 的使用频率更高,原因与在线下载商店不以全新格式(如OpusWebM 中的视频)出售音乐的原因相同。与运行古老或非常基本系统的人的兼容性。

  • @titaniumdecoy 您是否注意到最初编写该部分并将其编辑为 Kruug 的答案是完全不切实际的? (23认同)
  • “第 3 部分:兼容性”似乎是从 @Kruug 的回答中复制的。 (2认同)
  • 谢谢指出,我没注意。但是,在此页面上的两个不同答案中使用相同的文本块对我来说似乎有点愚蠢。 (2认同)
  • 这回答了为什么“tar”适合归档生态系统(即,将文件聚合在一起,提供性能提升和其他一些好处,例如权限保存),但它并没有解决为什么现代替代品(例如“dar”)不被使用的原因地方。换句话说,这个答案证明了文件聚合器的使用是合理的,但不能证明“tar”软件本身的合理性。 (2认同)

Kru*_*uug 102

已在 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 的使用频率更高,原因与在线下载商店不以全新格式(如OpusWebM 中的视频)出售音乐的原因相同。与运行古老或非常基本系统的人的兼容性很重要。

  • 这个答案绝对是“我有时会被不应得的赞成票吹走”的案例。它没有解决问题的核心问题,即列出压缩 tar 的内容,它甚至不是原始答案! (22认同)
  • 嗨@Kruug,我编辑了您的帖子只是为了从实际角度说明为什么人们在可以选择使用其他格式时仍然*选择* 使用这些格式。我没有更改您已有的文本。这只是为了确保这个问题的规范答案将具有完整的画面。如果您愿意,请随时编辑我的编辑:) (7认同)
  • 我不购买传统/最小公分母的论点;我记得在新系统 (sun) 上经常不得不下载 gzip/gunzip (从 sunfreeware) 只是为了安装其他 tar.gz 打包软件(加上 gnu tar,因为 sun 的 tar 被吸收了)。对于传统/较低的公分母,您有`tar.Z`(压缩/解压缩)。实用程序的进展一直是不断变化和改进的流(没有双关语):Z => zip => gz => bz2 => 7z => xz(或您喜欢的任何顺序)。至于 tar 的作用,有些 utils 只是 un/compress ,仍然需要 tar 来捆绑文件层次结构。 (6认同)
  • @allquixotic 开始有人吗?编辑和编辑的编辑,以便您可以编辑编辑... (5认同)
  • -1 为伟大的正义。这应该是评论。 (5认同)
  • @allquixotic 我感觉有点糟糕,当至少 50% 的答案是你的时,我得到了所有这些赞成票。 (2认同)
  • @ЯрославРахматуллин:这个答案从 Unix/Linux 用户的角度提供了使用 `tar` 的基本原理,读者认为这很有帮助。它值得我点赞。 (2认同)
  • XZ 使用 LZMA2 作为其压缩算法。唯一的区别是 7-zip 具有不同的元数据格式。用于压缩文件的数学与 LZMA2 完全相同。如果在 7-zip 中使用 PPMD​​ 压缩,某些输入数据可以产生更好的压缩率,但是 PPMD​​ 的运行时和内存成本远远超过现有的任何其他压缩算法,无论是压缩还是解压缩。 (2认同)

dmc*_*ten 63

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

  • 您希望提取的数据保留文件访问时间吗?焦油可以做到这一点。保留权限?焦油可以做到这一点。

  • 您想将符号链接保留为符号链接吗?默认情况下,Tar 会这样做。想要复制目标吗?焦油可以做到这一点。

  • 您是否想确保硬链接数据只存储一次(即做正确的事情)?焦油就是这样做的。

  • 你想很好地处理稀疏文件吗?焦油可以做到这一点。

  • 你想要未压缩的数据(为什么?)?焦油可以做到这一点。用gzip压缩?焦油可以做到这一点。用bzip2?焦油可以做到这一点。使用任意外部压缩程序?焦油可以做到这一点。

  • 您要写入原始设备或从原始设备恢复吗?Tar 的格式处理得很好。

  • 要将文件添加到现有存档中吗?焦油可以做到这一点。比较两个存档看看有什么变化?焦油可以做到这一点。仅更新存档中已更改的那些部分?焦油可以做到这一点。

  • 您想确保不会跨多个文件系统归档吗?焦油可以做到这一点。

  • 您只想抓取比上次备份更新的文件吗?焦油可以做到这一点。

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

  • 您是否需要保留设备节点(如 中的文件/dev)以便解压后系统能够正常运行?焦油可以做到这一点。

焦油已发展到处理很多很多的使用情况了几十年,确实知道了很多关于人的希望与Unix文件系统做的事情。

  • 您不需要 GNU tar 即可使用任意压缩器:只需告诉 tar 使用 `f -` 将存档写入标准输出并将其通过管道传输到压缩器。 (12认同)
  • “你想要未压缩的数据(为什么?)?” 我经常使用 `tar` 将文件系统树从一个地方复制到另一个地方并保留权限等,在这种情况下压缩只会占用额外的 CPU 周期。例如`tar cf - * | 焦油 xf - -C /somewhere`。 (3认同)

Mar*_*rco 31

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

使用归档器的原因

使用不压缩存档的一个原因是,例如,如果将一堆文件从一台主机复制到另一台主机。像下面这样的命令

tar cf - some_directory | ssh host "(cd ~/somewhere | tar xf -)"
Run Code Online (Sandbox Code Playgroud)

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

使用带有 gzip 压缩的归档器的原因

其中一个原因,我用targzip是:速度! 如果我想将几 GiB 的文本文件从一个地方传输到另一个地方,我不关心挤出最后一个字节,因为压缩仅用于传输,而不用于长期存储。在这些情况下,我使用gzip,它不会最大化 CPU(例如,与7-Zip相比),这意味着我再次受I/O限制而不是 CPU 限制。再说一遍:gzip可以认为随处可用。

理由使用tar赞成scprsync等等。

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

  • 出于性能原因,当通过超过压缩器压缩数据速度的超高带宽网络链接发送数据时,使用未压缩文件聚合通常更容易。例如,这可以通过千兆以太网实现;只有少数精心设计的压缩算法,压缩率也很差,即使在大型桌面 CPU 上也能如此快速地压缩数据。在嵌入式设备上,您可以使用更少的 CPU 时间。 (4认同)
  • 这不仅加快了速度,而且还允许保留文件所有权、时间戳和属性(如果用户权限允许) (3认同)
  • @AndreHolzner 对。我经常做`tar cf - 。| (cd ~/somewhere; tar xvf -)`。不必等到写入中央索引(例如在 zip 文件中),这真的很有用。 (3认同)
  • 您可能不需要,或者您的内容可能无法压缩。 (2认同)

Car*_*rós 25

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

我需要解压缩互联网上可用的文件。对于ziprar格式,我必须先下载它,然后解压缩它。随着tar.{gz,bz2,xz}我可以下载并在相同的步骤解压缩,而不需要有磁盘上的压缩档案phisically:

curl -s http://example.com/some_compressed_file.tar.gz | tar zx
Run Code Online (Sandbox Code Playgroud)

这将只在我的磁盘中留下未压缩的文件,并会加快整个过程,因为我不会浪费时间先下载整个文件,然后在下载完成后将其解压缩。相反,我在下载时解压缩它。您不能对ziprar文件执行此操作。

  • @psusi 不正确。您可以像 [this](http://serverfault.com/questions/26474/unzipping-files-that-are-flying-in-through-a-pipe) 那样进行黑客攻击,但它所做的是将所有文件下载到内存然后解压,而不是下载时解压。而 `funzip` 只是提取 zipfile 中的第一个文件,而不是全部。 (3认同)
  • 我不知道 rar (这是一个可怕的程序,似乎只是因为它能够拆分为多个较小的文件而受到海盗的欢迎),但是您可以很好地流式传输 zip。手册页甚至提到了它。它还具有能够有效地从大型存档中间提取或更新文件的优点,尽管 tar 往往会获得稍微更好的压缩。压缩与随机访问是一种权衡。 (2认同)
  • @Stu 只是为了澄清,不是问题,只是优化你的时间(如果那是你的想法,我不在乎空间) (2认同)

Яро*_*лин 14

坚持使用 (GNU) Tar 有几个原因。

这是:

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

如果您的特定问题是在能够阅读内容之前必须“解压缩”tarball,那么您可能是对的。WinRAR7-Zip会自动完成。但是,此问题有一些简单的解决方法,例如以未压缩的形式记录存档的内容。

  • Tar 还本地存储 UNIX 权限,并且非常有名并经过测试。在很多情况下,人们可能需要将一堆文件整合到一个文件或流中,但不一定要对其进行压缩。 (28认同)
  • Unix 诸神创造了它——因此我们必须使用它! (4认同)
  • 幸运的是 tar 不仅限于 GNU 版本。虽然 GNU tar 确实是一款不错的软件,但 libarchive + 相关前端要快得多,而且很容易嵌入到其他软件项目中。您可以为 tar 争论不休,而不会将其变成许可斗争。 (3认同)

psu*_*usi 11

表现

最大的区别在于压缩和存档在存档中完成的顺序tar,然后可以选择将存档发送到压缩器,并zip构建存档,并在将文件数据插入存档时以 32 KB 块压缩文件数据。通过将文件数据分成小块并分别压缩,它允许您提取特定文件或文件的一部分,而无需解压缩存档中的所有内容。它还可以防止压缩器在重新启动之前建立一个非常大的字典。这意味着压缩速度会更快,但不会像使用更大的字典大小压缩整个事物那样提供好的比率。

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

人气

还有许多其他格式比tar. 7-Zip不存储 Unix 文件权限,但dar确实并且zip可以,并且所有三个都存储索引,允许快速浏览、提取文件子集以及更新存档中的文件。他们还可以使用多核 CPU 进行压缩。

每个人仍在使用tar的原因与每个人仍在使用 Windows 和Flash 的原因相同:人们不喜欢变化。没有充分的理由去改变,人们只会坚持他们所知道的。dar当大多数人已经tar安装并且很少有人知道dar.

  • zip 不会以 32K 块的形式压缩文件。您将 32K 的滑动窗口大小与压缩的完成方式混淆了。 (3认同)
  • zip 可以存储和恢复 Unix 权限。InfoZIP 中的 zip 和 unzip 实用程序通常与 Unix 系统一起分发。 (2认同)

xor*_*yst 11

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

tar 方式的优点是您可以在从不可查找的管道(如网络套接字)读取数据的同时解压缩数据。

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

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

  • 不,您可以在管道中以流的形式读取和写入 zip 文件。 (5认同)

Mar*_*ler 11

似乎有些不愿意直接回答你的所有问题,显然更喜欢用你的问题作为论断的起点。所以我会试一试。

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

不。事实上,由于 tar 和 gzip 通常是两个进程,您甚至可以获得像 Info-ZIP 的 zip 这样的归档程序所不提供的一点多核速度优势。在压缩率方面,tar+gzip 通常明显优于 zip 和 deflate,因为前者可以从文件之间的相关性中受益,而后者单独压缩文件。这种压缩优势转化为提取时的速度优势,因为压缩程度更高的存档在更短的时间内解压缩。

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 实用程序。如果您只是想打包一堆东西,然后在另一端将它们全部拆开,那么除了使用最古老、最完整、调试最多的软件之外,几乎没有理由使用任何东西。

如果您想要随机访问、部分更新或其他需要零碎处理内容的事情,或者您希望能够在不阅读整个内容的情况下找出其中的内容,那么您将需要使用不同的格式。


tyl*_*erl 8

Tar 是为文件系统的备份全保真备份而创建的,而不仅仅是用于传输文件。因此,tar 实用程序是创建存档的最完整的实用程序,可保留有关文件系统结构的所有重要信息。

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

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

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

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


Mic*_*lon 5

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

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

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

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