前一篇我們介紹了關於 .tar 檔案的各種 tar 指令使用方式,這裡接著介紹以 .tar 格式為基礎所延伸出來的各種檔案壓縮格式。

因為單純的 .tar 檔案格式是沒有壓縮資料的功能的,它只是把好多目錄與資料夾打包起來,變成一個大檔案而已,如果要有壓縮資料的功能,必須配合另外的壓縮格式,以下介紹一般在 UNIX/Linux 中常用的壓縮格式。

.tar.gz 壓縮檔案

.tar.gz 壓縮檔案格式(等同於 .tgz)是在 UNIX/Linux 系統上最常見的壓縮檔案格式之一,這個檔案格式其實就是把一般的 .tar 檔案使用 gzip 再壓縮一次,下面這張圖就是描述這個概念。

tar_gzip

建立 .tar.gz 壓縮檔案

若要使用 tar 指令建立 .tar.gz 格式的壓縮檔,可以使用下面這個指令:

tar -zcvf mpi.tar.gz mpi

這樣就會建立一個 mpi.tar.gz 壓縮檔。這裡 tar 指令所使用的參數跟上一篇中產生 .tar 壓縮檔的時候很類似,只是多了一個 -z 而已,而這個 -z 就是代表把壓縮出來的 .tar 檔再丟給 gzip 來壓縮,至於其他的參數意義都跟之前的一樣,而輸出也是一模一樣,列出所有加入壓縮檔的檔案列表:
mpi/
mpi/mpi.pdf
mpi/mpi_simpson.R
mpi/mpi_simpson_nocompiler.R
mpi/MPI_Hello.c
mpi/mpi_simpson_plot.R
mpi/mpi.R
mpi/mpi2.R
mpi/mpi_simpson2.R
mpi/pi.c
mpi/my_phi.o
mpi/my_phi.so
mpi/MPI_Hello
mpi/mpi_simpson_nocompiler_plot.R
mpi/mpi_nocompiler.pdf
mpi/my_phi.c

tar 指令加上 -z 參數所產生的檔案,基本上就是把原本的 .tar 檔再丟給 gzip 壓縮一次,所以如果你本來就有一個 .tar 檔案了,而現在你想要把它壓縮成 .tar.gz 檔的話,其實也可以直接使用 gzip 指令直接針對 .tar 檔來壓縮,例如:

tar cvf mpi.tar mpi
gzip mpi.tar

第一行指令是產生一般的 .tar 檔,而在第二行我們把第一行產生的 mpi.tar 檔直接使用 gzip 壓縮,這樣也可以得到一個 mpi.tar.gz 壓縮檔,跟直接使用 tar 指令配合 -z 參數是一樣的效果。

如果感覺 .tar.gz 這個副檔名太長,亦可使用比較簡短的副檔名:

tar -zcvf mpi.tgz mpi

.tgz.tar.gz 兩種副檔名都是一樣的。

在使用 tar 指令建立 .tar 檔時可以使用 -W 參數來驗證檔案的正確性,但是在 .tar.gz 這類經過實際壓縮之後的檔案,就無法使用驗證的功能。

解壓縮 .tar.gz 壓縮檔案

若要解壓縮 .tar.gz 壓縮檔案,可使用下面的指令:

tar -zxvf mpi.tar.gz

基本上用法跟解壓縮 .tar 檔案的情況很像,只是加上 -z 參數而已,這是參數是代表這個壓縮檔是有經過

gzip

壓縮的,所以在解壓縮時,tar 會先使用 gzip 解壓縮的到 .tar 檔之後,自己再把 .tar 檔解開。所以事實上如果要自己手動呼叫 gzip 指令來解壓縮的話,可以這樣使用:

gzip -d mpi.tar.gz
tar xvf mpi.tar

或是直接使用管線(pipe)的方式:

gzip -cd mpi.tar.gz | tar xvf -

這個指令是把 mpi.tar.gz 這個壓縮檔先交給 gzip 解壓縮,其中 -d 參數是代表解壓縮,而 -c 參數則是把 gzip 解壓縮出來的資料直接輸出到標準輸出(standard output),而這些輸出的資料就是 mpi.tar.gz 這個壓縮檔經過 gzip 解壓縮之後的 .tar 格式資料,事實上如果你把這些資料存進檔案,它就是一個 mpi.tar,只是我們這裡沒有存進檔案中,而是利用管線(pipe)將它導引至 tar 指令繼續解壓縮。

隨後我們使用管線(pipe)將 gzip 所產生的輸出導到 tar 指令的標準輸入(standard input),這裡 tar 指令所使用的參數還是跟一般解壓縮的狀況相同,只是將輸入的檔案指定為標準輸入,而其指定的方式就是一個減號(-),這樣 tar 就會從標準輸入讀取資料後,進行解壓縮,最後就得到我們要的結果。

其實如果只是單純解壓縮一個 .tar.gz 檔,是不需要弄得這麼複雜的,直接使用一行 tar 指令就可以了,而這裡之所以要解釋這些比較複雜的管線指令,是因為管線的概念在進階的 UNIX/Linux 指令使用上很重要,這部分也是 UNIX/Linux 最強大的功能之一,如果你想要發揮 UNIX/Linux 的真正的實力,對於這些概念的了解是不可或缺的。

列出 .tar.gz 壓縮檔案的內容

若要列出 .tar.gz 壓縮檔中的內容,其指令的參數跟 .tar 檔的用法類似,也是多加上一個 -z 參數:

tar -ztvf mpi.tar.gz

.tar.gz 壓縮檔案中解壓縮指定的檔案

若要從 .tar.gz 壓縮檔中解開特定的檔案,可以直接將要解開的檔案名稱放在所有參數的最後,這個用法跟 .tar 檔的解壓縮方式是差不多的。

tar -zxvf mpi.tar.gz "mpi/mpi.R"

若要指定多個檔案也可以:

tar -zxvf mpi.tar.gz "mpi/mpi.R" "mpi/pi.c" "mpi/my_phi.c"

若要解開某一類的檔案,也可以使用 --wildcards 參數配合萬用字元來指定要解開的檔案:

tar -zxvf mpi.tar.gz --wildcards "*.c"

這樣就會把 mpi.tar.gz 壓縮檔中所有 C 語言的原始碼(*.c)都解開來,輸出為:
mpi/MPI_Hello.c
mpi/pi.c
mpi/my_phi.c

繼續閱讀:UNIX/Linux 檔案壓縮與備份工具 tar 指令使用教學與範例(三):tar.bz2 檔案