前一篇我們介紹了關於 .tar
檔案的各種 tar
指令使用方式,這裡接著介紹以 .tar
格式為基礎所延伸出來的各種檔案壓縮格式。
因為單純的 .tar
檔案格式是沒有壓縮資料的功能的,它只是把好多目錄與資料夾打包起來,變成一個大檔案而已,如果要有壓縮資料的功能,必須配合另外的壓縮格式,以下介紹一般在 UNIX/Linux 中常用的壓縮格式。
.tar.gz
壓縮檔案.tar.gz
壓縮檔案格式(等同於 .tgz
)是在 UNIX/Linux 系統上最常見的壓縮檔案格式之一,這個檔案格式其實就是把一般的 .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