Linux常见压缩格式Tar、Zip和Gz格式之不同

Linux 中大家在下载文件时常见的压缩文件有 .tar.zip.gz 等扩展名,大多数用户都已经见怪不怪了。那 Linux 中为什么要搞出这么多种压缩格式,Tar、Zip 和 Gz 之间到底有什么区别与不同呢?本文系统极客就为大家一一道来。

Tar、Zip和Gz格式的不同

Tar、Zip 和 Gz 之间的不同用最为简洁的描述来说可归纳为:

  • .tar 未压缩的归档文件
  • .zip (通常)压缩归档文件
  • .gz 使用gzip压缩的文件(归档或不归档)

存档文件的历史

与 Unix 和类 Unix 系统一样,故事开始于很久之前的七十年代。1979 年 1 月的一个清晨,Tar 实用程序首次作为 Unix V7 的一部分正式面世。Tar 程序当时主要被设计为往磁带上批量高效写入文件的一种方式。现在,虽然现在大多数 Linux 用户都已经不知道磁带驱动器是什么鬼了,但 tarballs(tar 的昵称)仍被常用于将多个文件甚至整个目录树打包到单一文件当中。

需要 Linux/Unix 用户注意的是,普通的 tar 格式文档只进行归档操作而不进行压缩。换句话说就是,如果你 tar 100 个 50kb 的文件得到的 tar 归档文件大小应该为 5000kb 左右。

使用 Tar 进行文件归档的唯一好处就是减少某种粒度磁盘空间的分配。(例如在簇大小为 4kb 的磁盘上 1 字节的文件也要占用 4kb 磁盘空间,若有 1000 个 1 字节的文件分散在此磁盘上的话,则会占用 4MB 大小,而使用 Tar 归档之后则只占用 1MB 左右大小。)

值得一提的是,tar 并非 Linux/Unix 中创建归档文件的唯一方式。程序员朋友应该知道 ar,它大多情况下主要用于创建静态库,实际它也是可用来创建其它种类归档的,例如 Debian 系统中使用的 .deb 包文件就是 ar 存档。而 macOS 的 mpkg 包是使用 gzip 压缩的 cpio 档。不过 ar 和 cpio 用起来不像 Tar 这样友好、简单,所以 tar 的受欢迎程度更高,普及更广。

Linux常见压缩格式Tar、Zip和Gz格式之不同

虽然归档是种不错的选择,但随着时间的推移和个人 PC 时代的到来,人们意识到可通过压缩数据的方式来大量节省存储成本。所以 10 年后随 MS-DOS 出现的 zip 文档便是支持压缩的归档格式,zip 最常见的压缩方式是采用 LZ77 算法实现的 deflate。由于它由 PKWARE 商业开发,所以 zip 格式也受专利保护多年。因此,为不侵犯到 PKWARE 的专利,同样采用 LZ77 算法的 gzip 格式被推出并广泛使用。

Unix 的哲学就是把某事做到最好,所以 gzip 只被设计为压缩文件。因此,为了创建压缩归档,必需先使用 tar 创建归档,之后再对归档文件进行压缩,因此才有了 .tar.gz 文件(为遵循 8.3 MS-DOS 文件名称限制,又被简称为 .tgz)。

随着技术的不断发展,具有更高压缩比的压缩算法也一一被实现,例如:在 bzip2 中实现的 Burrows-Wheeler 算法.tar.bz2 存档)和 LZMA 算法实现的 .xz 存档。

现在,用户已经可以在 Linux 和 Windows 中自由使用任何归档文件格式。由于 zip 格式已经被 Windows 操作系统原生支持,因此这种格式特别适合跨平台环境。

Tar、Zip和Gz格式效率测试

下面我们所讨论的是 Tar、Zip 和 Gz 文件格式压缩、归档后的磁盘空间效率而不是时间效率,如下是对 100MB 流行格式文件的测试对比:

文件类型.jpg.mp3.mp4.odt.png.txt
文件数216345279299020724397
磁盘占用98M99M99M98M98M98M
tar94M99M98M93M92M89M
zip (不压缩)92M99M98M91M91M86M
zip (deflate)87M98M93M85M77M28M
tar + gzip86M98M93M82M77M27M
tar + bz287M98M93M42M71M22M
tar + xz70M98M22M348K51M19M

Linux常见压缩格式Tar、Zip和Gz格式之不同

由于 jpg、mp3、mp4 已经是压缩封装的文件,所以再打包压缩的效果一定不会太好。

相关推荐