歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux常見壓縮格式Tar、Zip和Gz格式之不同

Linux常見壓縮格式Tar、Zip和Gz格式之不同

日期:2017/2/28 13:43:35   编辑:Linux教程

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 已經是壓縮封裝的文件,所以再打包壓縮的效果一定不會太好。

Copyright © Linux教程網 All Rights Reserved