在 Linux 系統上有很多可以用於壓縮檔案的工具,但它們的表現並不都是一樣的,也不是所有的壓縮效果都是一樣的。在這篇文章中,我們比較其中的五個工具。
在 Linux 上有不少用於壓縮檔案的命令。最新最有效的一個方法是 xz
,但是所有的方法都有節省磁碟空間和維護備份檔案供以後使用的優點。在這篇文章中,我們將比較這些壓縮命令並指出顯著的不同。
tar
命令不是專門的壓縮命令。它通常用於將多個檔案拉入一個單個的檔案中,以便容易地傳輸到另一個系統,或者將檔案作為一個相關的組進行備份。它也提供壓縮的功能,這就很有意義了,附加一個 z
壓縮選項能夠實現壓縮檔案。
當使用 z
選項為 tar
命令附加壓縮過程時,tar
使用 gzip
來進行壓縮。
就像壓縮一組檔案一樣,你可以使用 tar
來壓縮單個檔案,儘管這種操作與直接使用 gzip
相比沒有特別的優勢。要使用 tar
這樣做,只需要使用 tar cfz newtarfile filename
命令來標識要壓縮的檔案,就像標識一組檔案一樣,像這樣:
$ tar cfz bigfile.tgz bigfile ^ ^ | | +- 新的檔案 +- 將被壓縮的檔案$ ls -l bigfile*-rw-rw-r-- 1 shs shs 103270400 Apr 16 16:09 bigfile-rw-rw-r-- 1 shs shs 21608325 Apr 16 16:08 bigfile.tgz
注意,檔案的大小顯著減少了。
如果你願意,你可以使用 tar.gz
擴充套件名,這可能會使檔案的特徵更加明顯,但是大多數的 Linux 使用者將很可能會意識到與 tgz
的意思是一樣的 – tar
和 gz
的組合來顯示檔案是一個壓縮的 tar 檔案。在壓縮完成後,你將同時得到原始檔案和壓縮檔案。
要將很多檔案收集在一起並在一個命令中壓縮出 “tar ball”,使用相同的語法,但要指定要包含的檔案為一組,而不是單個檔案。這裡有一個範例:
$ tar cfz bin.tgz bin/* ^ ^ | +-- 將被包含的檔案 + 新的檔案
zip
命令建立一個壓縮檔案,與此同時保留原始檔案的完整性。語法像使用 tar
一樣簡單,只是你必需記住,你的原始檔名稱應該是命令列上的最後一個引數。
$ zip ./bigfile.zip bigfileupdating: bigfile (deflated 79%)$ ls -l bigfile bigfile.zip-rw-rw-r-- 1 shs shs 103270400 Apr 16 11:18 bigfile-rw-rw-r-- 1 shs shs 21606889 Apr 16 11:19 bigfile.zip
gzip
命令非常容易使用。你只需要鍵入 gzip
,緊隨其後的是你想要壓縮的檔名稱。不像上述描述的命令,gzip
將“就地”“加密”檔案。換句話說,原始檔案將被“加密”檔案替換。
$ gzip bigfile$ ls -l bigfile*-rw-rw-r-- 1 shs shs 21606751 Apr 15 17:57 bigfile.gz
像使用 gzip
命令一樣,bzip2
將在你選擇的檔案“就地”壓縮,不留下原始檔案。
$ bzip bigfile$ ls -l bigfile*-rw-rw-r-- 1 shs shs 18115234 Apr 15 17:57 bigfile.bz2
xz
是壓縮命令團隊中的一個相對較新的成員,在壓縮檔案的能力方面,它是一個領跑者。像先前的兩個命令一樣,你只需要將檔名稱提供給命令。再強調一次,原始檔案被就地壓縮。
$ xz bigfile$ ls -l bigfile*-rw-rw-r-- 1 shs shs 13427236 Apr 15 17:30 bigfile.xz
對於大檔案來說,你可能會注意到 xz
將比其它的壓縮命令花費更多的執行時間,但是壓縮的結果卻是非常令人讚嘆的。
大多數人都聽說過“大小不是一切”。所以,讓我們比較一下檔案大小以及一些當你計劃如何壓縮檔案時的問題。
下面顯示的統計資料都與壓縮單個檔案相關,在上面顯示的範例中使用 bigfile
。這個檔案是一個大的且相當隨機的文字檔案。壓縮率在一定程度上取決於檔案的內容。
當比較時,上面顯示的各種壓縮命產生下面的結果。百分比表示壓縮檔案與原始檔案的比較效果。
-rw-rw-r-- 1 shs shs 103270400 Apr 16 14:01 bigfile-------------------------------------------------------rw-rw-r-- 1 shs shs 18115234 Apr 16 13:59 bigfile.bz2 ~17%-rw-rw-r-- 1 shs shs 21606751 Apr 16 14:00 bigfile.gz ~21%-rw-rw-r-- 1 shs shs 21608322 Apr 16 13:59 bigfile.tgz ~21%-rw-rw-r-- 1 shs shs 13427236 Apr 16 14:00 bigfile.xz ~13%-rw-rw-r-- 1 shs shs 21606889 Apr 16 13:59 bigfile.zip ~21%
xz
命令獲勝,最終只有壓縮檔案 13% 的大小,但是所有這些壓縮命令都相當顯著地減少原始檔案的大小。
bzip2
、gzip
和 xz
命令都用壓縮檔案替換原始檔案。tar
和 zip
命令不替換。
xz
命令似乎比其它命令需要花費更多的時間來“加密”檔案。對於 bigfile
來說,大概的時間是:
命令 執行時間tar 4.9 秒zip 5.2 秒bzip2 22.8 秒gzip 4.8 秒xz 50.4 秒
解壓縮檔案很可能比壓縮時間要短得多。
不管你對壓縮檔案設定什麼許可權,壓縮檔案的許可權將基於你的 umask
設定,但 bzip2
除外,它保留了原始檔案的許可權。
zip
命令建立的檔案可以在 Windows 系統以及 Linux 和其他 Unix 系統上使用(即解壓),而無需安裝其他工具,無論這些工具可能是可用還是不可用的。
解壓檔案的命令與壓縮檔案的命令類似。在我們執行上述壓縮命令後,這些命令用於解壓縮 bigfile
:
tar xf bigfile.tgz
unzip bigfile.zip
gunzip bigfile.gz
bunzip2 bigfile.gz2
xz -d bigfile.xz
或 unxz bigfile.xz
如果你想自己執行一些測試,抓取一個大的且可以替換的檔案,並使用上面顯示的每個命令來壓縮它 —— 最好使用一個新的子目錄。你可能需要先安裝 xz
,如果你想在測試中包含它的話。這個指令碼可能更容易地進行壓縮,但是可能需要花費幾分鐘完成。
#!/bin/bash# 詢問使用者檔名稱echo -n "filename> "read filename# 你需要這個,因為一些命令將替換原始檔案cp $filename $filename-2# 先清理(以免先前的結果仍然可用)rm $filename.*tar cvfz ./$filename.tgz $filename > /dev/nullzip $filename.zip $filename > /dev/nullbzip2 $filename# 恢復原始檔案cp $filename-2 $filenamegzip $filename# 恢復原始檔案cp $filename-2 $filenamexz $filename# 顯示結果ls -l $filename.*# 替換原始檔案mv $filename-2 $filename