如今使用‘tar’有什么好处?

如今使用‘tar’有什么好处?

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

问题:

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

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

  • 既然tar是一种如此古老的文件格式,而如今又存在更新的文件格式,为什么tar(无论是封装在gzipbzip2还是新的xz)在 GNU/Linux、Android、BSD 和其他此类 UNIX 操作系统上仍然如此广泛地用于文件传输、程序源和二进制下载,有时甚至作为包管理器格式?

答案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。

方法 2

blah.tar.gz不管怎样,你都有。

您决定运行:

tar xvzf blah.tar.gz

这会

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

我们在此过程中,磁盘上有 1 GB 的压缩数据,就是这样。

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

如果你注意到,磁盘 I/O 量方法 2完全相同的Zip或执行的磁盘 I/O7-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 或压缩文件文件格式,因为它既压缩又指定将多个文件封装成单个文件的布局。

你不会看到 .7z 被更频繁地使用,原因与在线下载商店不以全新格式出售音乐的原因相同,例如作品或视频WebM. 与运行古老或非常基础系统的人们兼容。

答案2

已在 Stack Overflow 上得到解答

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

*nix 的理念是使用小型工具来很好地完成特定任务,并且可以将它们串联在一起。这就是为什么这里有两个具有特定任务的工具,并且它们的设计非常适合组合在一起。这也意味着您可以使用 tar 来分组文件,然后您可以选择压缩工具(bzip、gzip 等)。

许多工具以 .tar.gz 或 .tar.bz2 的源代码或二进制形式分发,因为它是“最低公分母”文件格式:就像大多数 Windows 用户可以使用 .zip 或 .rar 解压缩程序一样,大多数 Linux 安装(即使是最基本的安装)都可以访问至少targunzip,无论多旧或多精简。甚至 Android 固件也可以访问这些工具。

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

你不会看到 .7z 被更频繁地使用,原因与在线下载商店不以全新格式出售音乐的原因相同,例如作品或视频WebM. 与运行古老或非常基础系统的人们的兼容性非常重要。

答案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 文件系统做的事情。

答案4

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

我需要解压一个在互联网上可用的文件。无论是zip还是rar格式,我都必须先下载它,然后解压它。有了tar.{gz,bz2,xz}我可以在同一步骤中下载和解压,而无需将压缩档案物理地保存在磁盘上:

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

这样我的磁盘中就只剩下未压缩的文件了,这样可以加快整个过程,因为我不需要浪费时间先下载整个文件,然后在下载完成后再解压。相反,我会在下载时解压。您无法对ziprar文件执行此操作。

相关内容