![如今使用‘tar’有什么好处?](https://linux22.com/image/1355417/%E5%A6%82%E4%BB%8A%E4%BD%BF%E7%94%A8%E2%80%98tar%E2%80%99%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%A4%84%EF%BC%9F.png)
我知道那是tar
以前为磁带档案制作的,但今天我们拥有的档案文件格式既可以聚合文件,又可以在相同的逻辑文件格式内执行压缩。
问题:
tar
与使用在同一数据结构中进行聚合和压缩的文件格式相比,使用封装在gzip
或中的文件在聚合/压缩/解压缩阶段是否会降低性能bzip2
?假设被比较的压缩器的运行时间相同(例如 gzip 和 Deflate 类似)。tar
该文件格式是否具有其他文件格式(例如)所.7z
没有.zip
的功能?既然
tar
是一种如此古老的文件格式,而如今又存在更新的文件格式,为什么tar
(无论是封装在gzip
,bzip2
还是新的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.tar
和tar
文件格式的数据结构,包括文件权限、文件名、目录等信息。 - 将 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
bzip 和 gzip 适用于单个文件,而不是文件组。普通的 zip(和 pkzip)适用于文件组,并且具有内置存档的概念。
*nix 的理念是使用小型工具来很好地完成特定任务,并且可以将它们串联在一起。这就是为什么这里有两个具有特定任务的工具,并且它们的设计非常适合组合在一起。这也意味着您可以使用 tar 来分组文件,然后您可以选择压缩工具(bzip、gzip 等)。
许多工具以 .tar.gz 或 .tar.bz2 的源代码或二进制形式分发,因为它是“最低公分母”文件格式:就像大多数 Windows 用户可以使用 .zip 或 .rar 解压缩程序一样,大多数 Linux 安装(即使是最基本的安装)都可以访问至少tar
和gunzip
,无论多旧或多精简。甚至 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
这样我的磁盘中就只剩下未压缩的文件了,这样可以加快整个过程,因为我不需要浪费时间先下载整个文件,然后在下载完成后再解压。相反,我会在下载时解压。您无法对zip
或rar
文件执行此操作。