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 的受欢迎程度更高,普及更广。
虽然归档是种不错的选择,但随着时间的推移和个人 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 |
文件数 | 2163 | 45 | 279 | 2990 | 2072 | 4397 |
磁盘占用 | 98M | 99M | 99M | 98M | 98M | 98M |
tar | 94M | 99M | 98M | 93M | 92M | 89M |
zip (不压缩) | 92M | 99M | 98M | 91M | 91M | 86M |
zip (deflate) | 87M | 98M | 93M | 85M | 77M | 28M |
tar + gzip | 86M | 98M | 93M | 82M | 77M | 27M |
tar + bz2 | 87M | 98M | 93M | 42M | 71M | 22M |
tar + xz | 70M | 98M | 22M | 348K | 51M | 19M |
由于 jpg、mp3、mp4 已经是压缩封装的文件,所以再打包压缩的效果一定不会太好。