tar 指令是 UNIX/Linux 系統管理者最常會用到的指令之一,這裡蒐集一些使用範例,讓你透過範例了解如何使用 tar 來壓縮、解壓縮或備份檔案。

Linux 的 tar 指令是系統管理者常常會用到的檔案壓縮、解壓縮或備份指令,它的名字原本是代表「tape archive」,所以這個指令其實也常常用於磁帶的備份工作。

tar 本身在做的工作就是把一連串的檔案或資料夾壓縮成一個檔案,而在 Linux 中常見的壓縮格式有 tar、gzip 與 bzip 這三種,以目前說在 Linux 系統中最通用的壓縮格式這是這幾種,絕大部分的壓縮檔案都是使用這些壓縮格式,使用比較通用的壓縮格式對於不同硬碟或不同機器之間的資料交換會更方便。

在這裡我們會示範各種 tar 指令的使用方式,包含建立壓縮檔(例如 .tar.tar.gz、與 .tar.bz2 這些檔案格式)、解壓縮檔案、從壓縮檔中解開特定檔案、觀看壓縮檔的內容、驗證檔案、加入檔案或資料夾到既有的壓縮檔之中、估計 tar 壓縮檔的大小等。

透過這些範例的說明,可以讓你更了解 tar 指令可以做哪些事情,也可以幫助你在處理這些壓縮檔案時更得心應手。

.tar 壓縮檔案

.tar 是一種最簡單的壓縮檔案格式,這種檔案格式其實只是將很多的資料夾或檔案全部合併成一個大檔案而已,他只有做「打包」的動作,並沒有進行資料的壓縮。這種檔案格式通常用於簡單的管線(pipe)指令,做一些單純的複製檔案的動作,如果想要真正壓縮資料,就必須配合其他的壓縮格式(例如 gzipbzip2lzma 等)一起使用才行。

建立 .tar 壓縮檔案

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

tar -cvf mpi.tar mpi/

這個指令會將 mpi 資料夾與其中的所有檔案都壓縮成一個 mpi.tar 壓縮檔。壓縮時會顯示其中的檔案,輸出就會像這樣:

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 指令所使用的參數說明:

  • c:建立壓縮檔案(create)。
  • v:輸出處理的檔案列表(verbose)。
  • f:指定壓縮檔案(archive file)。

tar 指令的第一個參數是用於指定要執行的動作,而這個參數的減號(-)是可以省略的,只需要輸入對應功能的英文字母即可,像上面這個建立壓縮檔的指令也可以寫成這樣:

tar cvf mpi.tar mpi/

驗證 .tar 壓縮檔案

在建立 .tar 壓縮檔案時,如果是壓縮很重要的資料的話,可以加上驗證(verify)的選項,確保壓縮之後的檔案沒有錯誤:

tar cvfW mpi.tar mpi/

這樣在建立 .tar 檔之後,就會自動驗證一次裡面的檔案是否有問題,輸出為:

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
驗證 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

詳細說明可參考 GNU tar 的線上手冊

解壓縮 .tar 壓縮檔案

若要解壓縮 .tar 壓縮檔案,則可使用 tar 指令的 -x 參數(代表 extract),若要將上面壓縮好的 mpi.tar 壓縮檔解開,則可使用下面的指令:

tar -xvf mpi.tar

解壓縮的輸出跟壓縮時是一樣的,都是列出所有的檔案列表:

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

這個指令會將 mpi.tar 壓縮檔案的所有內容,直接解壓縮後放在目前所在的工作目錄中,如果想要指定解壓縮後的檔案放置位置,可以使用 -C 參數,例如:

tar -xvf mpi.tar -C /home/seal/tar_output/

這樣解壓縮後的檔案就會放在 /home/seal/tar_output/ 目錄中。

這裡 tar 指令的第一個 -xvf 參數同樣也可以將減號(-)省略,變成:

tar xvf mpi.tar -C /home/seal/tar_output/

這種省略減號的方式只適用於第一個參數,像這裡的 -C 參數就不可以省略,其他的狀況以此類推。

列出 .tar 壓縮檔案的內容

若只想要知道 .tar 壓縮檔的內容有哪些,而不想把壓縮檔解開的話,可以使用 tar 指令的 -t 參數,例如要列出 mpi.tar 壓縮檔裡面有哪些檔案,就可以使用下面這個指令:

tar -tvf mpi.tar

輸出為:

drwxrwxr-x seal/seal 0 2012-07-11 14:43 mpi/
-rw-rw-r-- seal/seal 5673 2012-06-06 15:35 mpi/mpi.pdf
-rw-rw-r-- seal/seal 989 2012-06-06 15:36 mpi/mpi_simpson.R
-rw-rw-r-- seal/seal 889 2012-06-06 15:38 mpi/mpi_simpson_nocompiler.R
-rw-rw-r-- seal/seal 299 2012-05-29 09:36 mpi/MPI_Hello.c
-rw-rw-r-- seal/seal 943 2012-06-06 15:33 mpi/mpi_simpson_plot.R
-rw-rw-r-- seal/seal 158 2012-06-15 07:57 mpi/mpi.R
-rw-rw-r-- seal/seal 233 2012-05-29 09:45 mpi/mpi2.R
-rw-rw-r-- seal/seal 1450 2012-06-06 15:51 mpi/mpi_simpson2.R
-rw-rw-r-- seal/seal 918 2012-05-28 16:04 mpi/pi.c
-rw-rw-r-- seal/seal 11432 2012-06-06 15:46 mpi/my_phi.o
-rwxrwxr-x seal/seal 13364 2012-06-06 15:46 mpi/my_phi.so
-rwxrwxr-x seal/seal 8605 2012-05-29 09:37 mpi/MPI_Hello
-rw-rw-r-- seal/seal 874 2012-06-06 15:33 mpi/mpi_simpson_nocompiler_plot.R
-rw-rw-r-- seal/seal 5530 2012-06-06 15:34 mpi/mpi_nocompiler.pdf
-rw-rw-r-- seal/seal 1016 2012-06-06 15:46 mpi/my_phi.c

這裡的輸出有點類似 ls -l 的效果,這是由於加入 -v 參數所致,如果只是想要簡單的檔案名稱列表,可以不需要加入 -v 參數,而這樣就會輸出單純的檔案列表:

tar -tf mpi.tar

這裡輸出就會跟上面壓縮或解壓縮時的輸出相同。

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

有時候整個 .tar 壓縮檔案很大,而你需要的檔案只是其中的幾個小檔案而已,那這個時候你就可以單獨解壓縮那些需要的部份,而不需要為了少數幾個檔案把整個壓縮檔案都解開,這樣既快速又省時間。

若要解開 .tar 壓縮檔中的某一些檔案,只要將要解壓縮的檔案放在所有參數的後面即可,例如若要將 mpi.tar 壓縮檔案中的 mpi/mpi.R 這個檔案解開來,就使用下面這個指令:

tar -xvf mpi.tar "mpi/mpi.R"

如果要解壓縮好幾個檔案,就把所有的檔案名稱都加在參數的最後面就可以了,例如:

tar -xvf mpi.tar "mpi/mpi.R" "mpi/pi.c" "mpi/my_phi.c"

如果你想要一次解壓縮某一類的檔案,也可以使用 --wildcards 參數以萬用字元(wildcard)的方式來指定檔案,這種方式檔案數量很多的時候特別好用,例如若要解壓縮所有 C 語言的程式碼檔案(所有附檔名為 .c 的檔案),就使用:

tar -xvf mpi.tar --wildcards "*.c"

這樣就會解壓縮三個 .c 的檔案,輸出為:
mpi/MPI_Hello.c
mpi/pi.c
mpi/my_phi.c

在指定檔案名稱時,為了怕有些檔案名稱比較奇怪,會容易造成 shell 在解析時出問題,所以最保險的方式就是像這裡的範例一樣用雙引號把檔案名稱包起來,這樣比較不會出問題。而在使用萬用字元時,就一定要使用雙引號,否則 shell 會把萬用字元直接展開。

加入新的檔案或目錄到 .tar 壓縮檔案中

如果想把新的檔案或目錄加到既有的 .tar 壓縮檔中,可以使用 -r 這個參數,然後把要加入的檔案全部放在參數的最後面,例如若要把 test_append.txt 這個檔案加入 mpi.tar 中,則使用下面這個指令:

tar -rvf mpi.tar test_append.txt

這樣 test_append.txt 就加進去了,輸出為:
test_append.txt
我們可以把壓縮檔的內容列出來驗證一下:

tar -tvf mpi.tar

輸出為:

drwxrwxr-x seal/seal 0 2012-07-11 14:43 mpi/
-rw-rw-r-- seal/seal 5673 2012-06-06 15:35 mpi/mpi.pdf
-rw-rw-r-- seal/seal 989 2012-06-06 15:36 mpi/mpi_simpson.R
-rw-rw-r-- seal/seal 889 2012-06-06 15:38 mpi/mpi_simpson_nocompiler.R
-rw-rw-r-- seal/seal 299 2012-05-29 09:36 mpi/MPI_Hello.c
-rw-rw-r-- seal/seal 943 2012-06-06 15:33 mpi/mpi_simpson_plot.R
-rw-rw-r-- seal/seal 158 2012-06-15 07:57 mpi/mpi.R
-rw-rw-r-- seal/seal 233 2012-05-29 09:45 mpi/mpi2.R
-rw-rw-r-- seal/seal 1450 2012-06-06 15:51 mpi/mpi_simpson2.R
-rw-rw-r-- seal/seal 918 2012-05-28 16:04 mpi/pi.c
-rw-rw-r-- seal/seal 11432 2012-06-06 15:46 mpi/my_phi.o
-rwxrwxr-x seal/seal 13364 2012-06-06 15:46 mpi/my_phi.so
-rwxrwxr-x seal/seal 8605 2012-05-29 09:37 mpi/MPI_Hello
-rw-rw-r-- seal/seal 874 2012-06-06 15:33 mpi/mpi_simpson_nocompiler_plot.R
-rw-rw-r-- seal/seal 5530 2012-06-06 15:34 mpi/mpi_nocompiler.pdf
-rw-rw-r-- seal/seal 1016 2012-06-06 15:46 mpi/my_phi.c
-rw-rw-r-- seal/seal 28 2013-07-06 14:04 test_append.txt

除了加入檔案之外,若要加入整個目錄也可以,使用方式也相同,例如:

tar -rvf mpi.tar dir1 dir2

這樣就會把 dir1dir2 兩個目錄連同裡面的所有檔案都加入到 mpi.tar 壓縮檔案中。

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