徹底搞懂Linux歸檔壓縮神器~tar

tar命令概述

tar命令可以歸檔檔案。它最初是設計用來將資料儲存在磁帶上,因此其名字也來源於Tape ARchive。tar可以將多個檔案和資料夾打包為單個檔案,同時還能保留所有的檔案屬性,如所有者、許可權等。由tar建立的檔案通常稱為tarball。

徹底搞懂Linux歸檔壓縮神器~tar

實戰演練

tar命令可以建立、更新、檢查以及解包歸檔檔案。

(1)用tar建立歸檔檔案:

$ tar -cf output。tar [SOURCES]

選項-c表示建立新的歸檔檔案。選項-f表示歸檔檔名,該選項後面必須跟一個檔名稱:

$ tar -cf archive。tar file1 file2 file3 folder1 。。

(2)選項-t可以列出歸檔檔案中所包含的檔案:

$ tar -tf archive。tar

file1

file2

徹底搞懂Linux歸檔壓縮神器~tar

(3)選項-v或-vv引數可以在命令輸出中加入更多的細節資訊。

這個特性叫作“冗長模式(v,verbose)”或“非常冗長模式(vv,very verbose)”。對於能夠在終端中生成報告的命令,-v是一個約定的選項。該選項能夠顯示出更多的細節,例如檔案許可權、所有者所屬的分組、檔案修改日期等資訊:

$ tar -tvf archive。tar

-rw-rw-r—— shaan/shaan 02013-04-08 21:34 file1

-rw-rw-r—— shaan/shaan 02013-04-08 21:34 file2

檔名必須緊跟在-f之後出現,而且-f應該是選項中的最後一個。假如你希望使用冗長模式,應該像這樣寫:

$ tar -cvf output。tar file1 file2 file3 folder1

正則表示式在tar中的應用

tar命令可以接受一組檔名或是萬用字元(如*。txt),以此指定需要進行歸檔的原始檔。命令執行完畢後,所有的原始檔都會被歸入指定的歸檔檔案中。

命令列引數有數量限制,我們無法一次性傳遞數百個檔案或目錄。如果要歸檔的檔案很多,那麼使用追加選項要更安全些。

徹底搞懂Linux歸檔壓縮神器~tar

tar追加部分檔案到壓縮檔

選項-r可以將新檔案追加到已有的歸檔檔案末尾

tar -rvf original。tar new_file

如何列舉壓縮檔中的檔案

這個特性在壓縮檔很大的時候,只想提取其中幾個檔案的時候很有用。

選項-t可以列出歸檔檔案中的內容。選項-f可以指定歸檔檔名

tar -tf archive。tar

hello。txt

徹底搞懂Linux歸檔壓縮神器~tar

從歸檔檔案中提取檔案或目錄

選項-x可以將歸檔檔案的內容提取到當前目錄使用-x時,tar命令將歸檔檔案中的內容提取到當前目錄。我們也可以用選項-C來指定將檔案提取到哪個目錄。

這一點也很有用,再也不用把檔案來回copy了。

$ tar -xf archive。tar -C /path/to/extraction_directory

徹底搞懂Linux歸檔壓縮神器~tar

在tar中使用stdin和stdout

將stdout指定為輸出檔案,這樣另一個命令就可以透過管道來讀取(作為stdin)並進行其他處理。

當透過安全shell(Secure Shell,SSH)傳輸資料時

tar cvf - files/ | ssh user@example。com “tar xv -C Documents/”

對files目錄中的內容進行了歸檔並將其輸出到stdout(由-指明),然後提取到遠端系統中的Documents目錄中。

這種一邊壓一邊解的操作都是在記憶體中進行不盡快而且不用中間儲存。缺點就是透明,無法獲知內部進度。

拼接兩個歸檔檔案

假設我們現在有兩個tar檔案:file1。tar和file2。tar。下面的命令可以將file2。tar的內容合併到file1。tar中

tar -Af file1。tar file2。tar

透過檢查時間戳來更新歸檔檔案中的內容

追加選項(-r)可以將指定的任意檔案加入到歸檔檔案中。如果同名檔案已經存在,那麼歸檔檔案中就會包含兩個名字一樣的檔案。我們可以用更新選項-u指明:只新增比歸檔檔案中的同名檔案更新(newer)的檔案。

這個操作也很實用,如果壓縮檔案中有一兩個需要更新就不用花費時間壓縮整個文件

了。

tar -uf archive。tar filea

可以使用-t 來驗證時間戳是否改變,或者-xf解壓出新檔案檢視內容確定

比較歸檔檔案與檔案系統中的內容

選項-d可以將歸檔中的檔案與檔案系統中的檔案作比較。這個功能能夠用來確定是否需要建立新的歸檔檔案。

從歸檔中刪除檔案

tar -f archive。tar ——delete file1 file2

壓縮tar歸檔檔案

很容易混淆的一個概念,tar只是歸檔並沒有壓縮。-a或——auto-compress選項完成壓縮

tar命令預設只歸檔檔案,並不對其進行壓縮。不過tar支援用於壓縮的相關選項

。壓縮能夠顯著減少檔案的體積。歸檔檔案通常被壓縮成下列格式之一。

❏ gzip格式:file。tar。gz或file。tgz。

❏ bzip2格式:file。tar。bz2。

❏ Lempel-Ziv-Markov格式:file。tar。lzma。

不同的tar選項可以用來指定不同的壓縮格式:

❏ -j指定bunzip2格式;

❏ -z指定gzip格式;

❏ ——lzma指定lzma格式。

不明確指定上面那些特定的選項也可以使用壓縮功能。

tar的壓縮智慧演算法

tar能夠基於輸出或輸入檔案的副檔名來進行壓縮。為了讓tar支援根據副檔名自動選擇壓縮算。

在歸檔過程中排除部分檔案

選項——exclude [PATTERN]可以將匹配萬用字元模式的檔案排除在歸檔過程之外。

注意,模式應該使用雙引號來引用,避免shell對其進行擴充套件。

如果需要排除的檔案較多也可以將需要排除的檔案列表放入檔案中,同時配合選項-X:

$ cat list

filea

fileb

$ tar -cf arch。tar * -X list

排除版本控制目錄

tar檔案的用處之一是用來分發原始碼。很多原始碼都是使用版本控制系統進行維護的,如subversion、Git、mercurial、CVS。版本控制系統中的程式碼目錄通常包含一些特殊目錄,如。svn或。git。

這些目錄由版本控制系統負責管理,對於開發者之外的使用者並沒有什麼用。

因此無需將其包含在分發給使用者的tar檔案內。

tar的選項——exclude-vcs可以在歸檔時排除版本控制相關的檔案和目錄

列印總位元組數

選項-totals可以打印出歸檔的總位元組數。注意,這是實際資料的位元組數。如果使用了壓縮選項,檔案大小會小於總的歸檔位元組數:

$ tar -cf arc。tar * ——exclude “*。txt” ——totals

Total bytes written: 20480 (20KiB, 12MiB/s)