1. 程式人生 > >tar命令和排除目錄或檔案

tar命令和排除目錄或檔案

tar 命令
  用途
  處理歸檔。
  語法
  tar { -c | -r | -t | -u | -x } [ -b Blocks ] [ -B ] [ -d ] [ -F ] [ -h ] [ -i ] [ -L InputList ] [ -l ] [ -m ] [ -N Blocks ][ -o ] [ -p ] [ -s ] [ -v ] [ -w ] [ -Number ] [ -f Archive ] [ -S Blocksb | -S Feet | -S Feet@density ] [ File | Directory | -C Directory ] ...
  描述
  注意:由於在 tar 命令中對頭塊空間的限制,當恢復到某些系統時,大於 65,535 的使用者號(UID)和組標識號(GID)將毀壞。大小約束隻影響所有權和許可權而不對資料造成損害。所有權的毀壞發生在下列系統中:
  * 不使用 uname 和 gname 欄位來檢查所有權的系統。
  * 與歸檔系統沒有相同的使用者和組標識的系統。
  注:
  1. ustar 頭格式允許檔案大到 8 GB。因此,tar 命令支援歸檔最大 8 GB 的檔案。
  2. tar 不保留任何稀疏分配的檔案的稀疏屬性。任何在恢復前原是稀疏的檔案,將按檔案大小在檔案系統內分配其所有空間。
  tar 命令通過將檔案寫入歸檔儲存介質或將檔案從介質中取回,來處理歸檔。由 tar 命令使用的檔案通過 File 引數來表示。如果 File 引數引用一個目錄,則引用該目錄並遞迴引用該目錄下全部的檔案和目錄。
  tar 命令在預設裝置(通常是磁帶)上尋找歸檔,除非使用 -f Archive 標誌指定另一個裝置。當為美國磁帶歸檔程式(USTAR)格式指定大於 100 個字元的路徑名稱時,請記住路徑名稱是由一個字首緩衝區、一個 /(斜槓)和一個名稱緩衝區組成的。
  字首緩衝區最大可以有 155 位元組,而名稱緩衝區最大可以容納 100 位元組。如果路徑名稱不能用斜槓分割為這兩部分,則它不能被歸檔。這個限制是考慮到 tar 歸檔頭的結構,而且必須為了符合標準和向下相容而維護該限制。另外,硬連結或符號連結(“連結名稱”)的目標長度不能超出 100 位元組。
  當寫到歸檔時,tar 命令使用一個臨時檔案(/tmp/tar* 檔案),並在記憶體中維護一個包含多連結檔案的表。如果 tar 命令不能建立臨時檔案,或者沒有足夠的可用記憶體來放置連結表,您會接收到錯誤訊息。
  tar 命令有兩組標誌:必需標誌和可選標誌。必需標誌控制 tar 命令的操作,包括 -c、-r、-t、-u 和 -x 標誌。要執行 tar 命令至少要選擇一個必需標誌。選擇了必需標誌後,您可以選擇一個可選標誌,但它們對控制 tar 命令都不是必要的。
  注:
  1. 當儲存裝置是一個普通檔案或一個塊特殊檔案時,-u 和 -r 標誌可退格。然而,原始磁帶裝置不支援退格。因此當儲存裝置是原始磁帶時,-u 和 -r 標誌進行倒帶、開啟磁帶並再次讀取磁帶。
  2. 在塊磁帶上記錄的長度是一塊,但它們通常比在原始磁帶上的密度的一半還少。因此,儘管按塊記錄原始磁帶必須被讀取兩遍,但磁帶運動總量比從塊式磁帶讀取一遍單塊記錄還少。
  3. 流式磁帶裝置的結構不支援在磁帶最後增加資訊。因此,當儲存裝置是流式磁帶時,-u 和 -r 標誌不是有效的選項。試圖使用這些標誌將導致下列錯誤訊息:
  tar: 更新和替換選項對流式磁帶機無效。
  4. 磁帶錯誤無法恢復。
  5. 可以通過更改預設塊大小改善 tar 命令在 IBM 9348 磁帶機 12 型上的效能。要更改塊大小,請在命令列輸入下列命令:
  chdev -1 <device_name> -a block_size=32k
  要了解更多關於使用磁帶裝置的資訊,請參閱 rmt 特殊檔案。
  標誌
  tar 命令的標誌有兩組,必需的和可選的。必須提供至少一個必需標誌來控制 tar 命令。
  必需標誌
  -c 建立新的歸檔,並將由一個或多個 File 引數所指定的檔案寫入歸檔的開頭。
  -r 將由一個或多個 File 引數所指定的檔案寫入歸檔的最後。這個標誌不是對任何磁帶裝置都有效,因為有些裝置不支援在磁帶的最後新增資訊。
  -t 按照檔案在歸檔中的順序列出檔案。檔案可能會多次列出。
  -u 只有當檔案不在歸檔中,或寫入歸檔後被修改過,才將這些檔案(由一個或多個 File 引數所指定)寫入歸檔的最後。-u 標誌不是對任何磁帶裝置都有效,因為有些磁帶裝置不支援在磁帶的最後新增資訊。
  -x 從歸檔中抽取一個或多個 File 引數指定的檔案。如果 File 引數是指一個目錄, tar 命令遞迴地從歸檔中抽取那個目錄。如果您未指定 File 引數,tar 命令從歸檔中抽取所有的檔案。如果歸檔中包含同一檔案的多個副本,最後抽取的副本覆蓋所有以前抽取的副本。如果被抽取的檔案在系統中不存在,則建立該檔案。如果您有適當的許可權,tar 命令用與磁帶上的相同所有者和組標識恢復所有檔案和目錄。如果您沒有適當的許可權,將以您的所有者標識和組標識恢復檔案和目錄。只能請求檔案最後出現的版本。
  可選標誌
  -B 輸入分塊和輸出分塊強制為每個記錄 20 塊。使用這個選項,tar 命令可在那些可能未維護分塊的通訊通道間執行。
  -b Blocks 指定每個記錄的 512 位元組塊數量。預設值和最大值都是 20,這是對磁帶記錄適當的數目。由於記錄間隙大小的原因,用大的分塊因子寫的磁帶可以比每個記錄只有一塊的磁帶儲存更多的資料。
  當讀取磁帶時,塊大小自動確定(-x 或 -t 功能標誌)。歸檔被 -u 和 -r 功能更新時,使用現有的記錄大小。只有當使用 -c 標誌建立新的歸檔時,tar 命令才使用 Blocks 引數指定的值寫入歸檔。
  當用 -f 標誌輸出到普通檔案時,您可以使用與磁碟塊大小相匹配的分塊因子來節省磁碟空間(例如,對於 2048 位元組的磁碟塊,使用 -b4 標誌)。
  -C Directory 使 tar 命令向由 Directory 變數指定的目錄執行 chdir 子例程。使用 -C 標誌允許歸檔不用相近公共父目錄來關聯的多個目錄,使用簡短的相對路徑名稱。例如,要從 /usr/include 和 /etc 目錄中歸檔檔案,可以使用下列命令:
  tar c -C /usr/include File1 File2 -C /etc File3 File4
  -C Directory 標誌必須在所有其它標誌後出現,也可以在給定的檔名列表中出現。
  -d 為塊檔案、特殊字元檔案以及先進先出(FIFO)管道程序建立單獨條目。通常,tar 命令不會歸檔這些特殊檔案。當使用 -d 標誌寫入歸檔時,tar 命令使歸檔可以用 -x 標誌恢復空目錄、特殊檔案以及先進先出(FIFO)管道程序。
  注:
  雖然任何人可以歸檔特殊檔案,但只有擁有 root 使用者許可權的使用者可以從歸檔中抽取特殊檔案。
  -F 在歸檔前檢查檔案型別。原始碼控制系統(SCCS),修訂控制系統(RCS),名為 core、errs 和 a.out 的檔案,以及以 .o(點 o)結束的檔案不歸檔。
  -f Archive 使用 Archive 變量表示要讀或寫的歸檔。當未指定這個標誌,tar 命令使用一個針對特定系統的預設檔名(格式為 /dev/rmt0)。如果指定的 Archive 變數是 -(減號),tar 命令寫入標準輸出或從標準輸入中讀取。如果寫入標準輸出,您必須使用 -c 標誌。
  -h 強制 tar 命令監視符號連結,就好像它們是常規檔案或目錄。通常,tar 命令不監視符號連結。
  -i 忽略頭校驗和的錯誤。tar 命令在歸檔中寫入一個檔案頭,它包含每個檔案的校驗和。如果未指定這個標誌,系統通過重新計算校驗和來驗證頭塊的內容,並在發生不匹配時,停止並報目錄校驗和錯誤。如果指定這個標誌,tar 命令將記錄錯誤,然後向前掃描直到查詢到一個有效的頭塊。這就允許從多卷歸檔的後面的卷中恢復檔案,而不需讀取前面的卷。
  -L InputList :-L 選項的 Inputlist 引數應該總是一個檔名稱,該名稱列出需要歸檔的檔案和目錄。
  同樣地,InputList 引數可以是一個儲存某檔名稱的變數,該檔案列出要歸檔的檔案和目錄。
  這個選項幫助將列在 InputList 引數中的檔案和目錄寫入歸檔。 InputList 引數中的目錄不被遞迴。對於包含於 InputList 引數中的目錄,tar 命令只將目錄寫入歸檔,而不將目錄中的檔案和子目錄寫入歸檔。
  如果額外的檔案和目錄在命令列中跟在 InputList 引數後,InputList 引數的內容歸檔在這些檔案和目錄之後。這些額外的檔案或目錄按它們的預設行為歸檔,即將它們遞迴地歸檔。
  -l 對於每個帶有連結數大於 1 的檔案,而其相應的連結卻未歸檔,寫錯誤訊息到標準輸出。例如,如果 file1 和 file2 是用硬連結連結在一起,而只有 file1 存放在歸檔中,則 -l 標誌將發出錯誤訊息。如果未指定 -l 標誌,將不顯示錯誤訊息。
  -m 使用抽取時間作為修改時間。預設是保留檔案的修改時間。
  -N Blocks 當 tar 命令處理流式磁帶歸檔時,允許它使用很大的塊的簇。然而請注意,在輸入時,如果用這個標誌建立了非常長的塊大小, tar 命令將不能自動確定磁帶的塊大小。沒有 -N Blocks 標誌時,tar 命令可以自動確定的最大塊大小為 20 塊。
  -o 提供與舊版本(非 AIX)tar 命令的向下相容。當使用這個標誌進行讀取時,被抽取的檔案使用執行程式的使用者的使用者標識和組標識(UID 和 GID),而不是歸檔中的使用者標識和組標識。這是對於普通使用者的預設行為。
  -p 恢復欄位到它們的原始方式,忽略現有的使用者許可權遮蔽位(umask)。 setuid、setgid 和 tacky 位許可權也恢復給擁有 root 使用者許可權的使用者。這個標誌恢復檔案到其原始方式,但不恢復目錄到其原始方式。
  -s 如果 tar 命令未能使用 -s 標誌成功嘗試連結(常規連結)兩個檔案,請試著建立符號連結。
  -SBlocksb, -S Feet, -S Feet
@density
 指定每卷中的 512KB 塊的數目(第一種格式),不依賴於磁帶分塊因子。您也可以使用第二種格式,用英尺來指定磁帶大小,在這種情況下,tar 命令假定一個預設的 Density 變數。第三種格式允許您指定磁帶長度和密度。英尺被保守地假定為 11 英寸長。這個標誌讓您更容易處理多卷磁帶歸檔,這時 tar 命令必須能夠確定每卷能放入多少塊。
  注:
  1. 磁帶機在密度能力上有差異。Density 變數計算系統在磁帶上可放入的資料量。
  2. 如果使用 1/4 英寸磁帶裝置,在指定 Feet 變數的值時,一定要考慮磁帶裝置上的磁軌數目。例如,可以使用 -S Feet@density
 標誌來指定一個有 600 英尺磁帶和 8000 位元組/英寸密度的 4 磁軌、1/4 英寸磁帶機,如下:
  -S 2400@8000
  這裡,600 英尺乘以 4 磁軌等於 2400 英尺。
  -v 在處理每個檔案時,列出它們的名稱。使用 -t 標誌,-v 給出磁帶條目的更多資訊,包括檔案大小、上次修改的時間、使用者標識(UID)、組標識(GID)和許可權。
  -w 顯示要進行的操作,跟著是檔名,然後等候使用者確認。如果回答是肯定的,則執行操作。如果回答不是肯定的,則忽略檔案。
  -Number 使用 /dev/rmtNumber 檔案,而不是預設值。例如,-2 標誌和 -f/dev/rmt2 檔案是相同的。
  退出狀態
  該命令返回下列退出值:
  0 成功完成。
  >0 有錯誤發生。
  示例
  1. 要將 file1 和 file2 檔案寫到預設磁帶機上新的歸檔中,請輸入:
  tar -c file1 file2
  2. 要從 /dev/rmt2 磁帶裝置上的歸檔檔案中抽取 /tmp 目錄裡的全部檔案,並以抽取時間作為修改時間,請輸入:
  tar -xm -f/dev/rmt2 /tmp
  3. 要新建一個包含 file1 檔案的歸檔檔案,並傳遞迴檔檔案到 dd 命令,使之被寫到 /dev/rmt1 裝置,請輸入:
  tar -cvf - file1 | dd of=/dev/rmt1 conv=sync
  4. 要顯示當前目錄上 out.tar 磁碟歸檔檔案中各檔案的名稱,請輸入:
  tar -vtf out.tar
  5. 要擴充套件壓縮了的 tar 歸檔檔案,fil.tar.z, 傳遞檔案到 tar 命令,並從擴充套件了的 tar 歸檔檔案中抽取全部檔案,請輸入:
  zcat fil.tar.Z | tar -xvf -
  6. 要使用簡短相對路徑名稱歸檔 /usr/include 和 /usr/bin 檔案的內容,請輸入:
  cd /usr
  tar -cvf/dev/rmt0 -C./include . -C ../bin .
  注:
  當用相對路徑名稱指定 -C 標誌的多個例項,使用者必須考慮到先前的 -C 標誌請求。
  7. 要在使用 -S 標誌時歸檔到一個 8 毫米裝置,請輸入:
  tar -cvf /dev/rmt0 -S 4800000b /usr
  注:
  當歸檔到 8 毫米裝置, 不推薦用 -S Feet 和 -S Feet
@density
 標誌,因為 8 毫米裝置在寫入磁帶時不使用密度概念。
  8. 要歸檔所有 C 檔案的一個列表(這些檔案通過 -L 選項的 InputList 引數被列在檔案中),請輸入:
  tar -cvf fl.tar -L fl_list
  這裡,fl_list 是一個檔案,它包含一個所有 .c 檔案的列表。這可以通過以下命令獲得:
  ls *.c > fl_list
  9. 要使用 -L 選項設定變數來歸檔所有 C 檔案的一個列表,請輸入:
  ls *.c > fl_list
  fl=fl_list
  tar -cvf var.tar -L $fl
  檔案
  /dev/rmt0 指定預設磁帶裝置。
  /bin/tar 指定 tar 命令的符號連結。
  /usr/bin/tar 包含 tar 命令。
  /tmp/tar* 指定臨時檔案。
  =====================
  tar 是linux下的一種打包程式,也可以說是一種壓縮格式。
  linux下的壓縮格式有.gz、.tar.gz、tgz、bz2、.Z、.tar等,tar是其中的一種。
  在說linux的壓縮檔案之前呢,首先要弄清兩個概念:打包和壓縮。打包是指將一大堆檔案或目錄什麼的變成一個總的檔案,壓縮則是將一個大的檔案通過一些壓縮演算法變成一個小檔案。為什麼要區分這兩個概念呢?其實這源於Linux中的很多壓縮程式只能針對一個檔案進行壓縮,這樣當你想要壓縮一大堆檔案時,你就得先借助另它的工具將這一大堆檔案先打成一個包,然後再就原來的壓縮程式進行壓縮。
  Linux下最常用的打包程式就是tar了,使用tar程式打出來的包我們常稱為tar包,tar包檔案的命令通常都是以.tar結尾的。生成tar包後,就可以用其它的程式來進行壓縮了,所以首先就來講講tar命令的基本用法:
  tar命令的選項有很多(用man tar可以檢視到),但常用的就那麼幾個選項,下面來舉例說明一下:
  # tar -cf all.tar *.jpg
  這條命令是將所有.jpg的檔案打成一個名為all.tar的包。-c是表示產生新的包,-f指定包的檔名。
  # tar -rf all.tar *.gif
  這條命令是將所有.gif的檔案增加到all.tar的包裡面去。-r是表示增加檔案的意思。
  # tar -uf all.tar logo.gif
  這條命令是更新原來tar包all.tar中logo.gif檔案,-u是表示更新檔案的意思。
  # tar -tf all.tar
  這條命令是列出all.tar包中所有檔案,-t是列出檔案的意思
  # tar -xf all.tar
  這條命令是解出all.tar包中所有檔案,-x是解開的意思
  以上就是tar的最基本的用法。為了方便使用者在打包解包的同時可以壓縮或解壓檔案,tar提供了一種特殊的功能。這就是tar可以在打包或解包的同時呼叫其它的壓縮程式,比如呼叫gzip、bzip2等。
  1) tar呼叫gzip
  gzip是GNU組織開發的一個壓縮程式,.gz結尾的檔案就是gzip壓縮的結果。與gzip相對的解壓程式是gunzip。tar中使用-z這個引數來呼叫gzip。下面來舉例說明一下:
  # tar -czf all.tar.gz *.jpg
  這條命令是將所有.jpg的檔案打成一個tar包,並且將其用gzip壓縮,生成一個gzip壓縮過的包,包名為all.tar.gz
  # tar -xzf all.tar.gz
  這條命令是將上面產生的包解開。
  2) tar呼叫bzip2
  bzip2是一個壓縮能力更強的壓縮程式,.bz2結尾的檔案就是bzip2壓縮的結果。與bzip2相對的解壓程式是bunzip2。tar中使用-j這個引數來呼叫gzip。下面來舉例說明一下:
  # tar -cjf all.tar.bz2 *.jpg
  這條命令是將所有.jpg的檔案打成一個tar包,並且將其用bzip2壓縮,生成一個bzip2壓縮過的包,包名為all.tar.bz2
  # tar -xjf all.tar.bz2
  這條命令是將上面產生的包解開。
  3)tar呼叫compress
  compress也是一個壓縮程式,但是好象使用compress的人不如gzip和 bzip2的人多。.Z結尾的檔案就是bzip2壓縮的結果。與compress相對的解壓程式是uncompress。tar中使用-Z這個引數來呼叫gzip。下面來舉例說明一下:
  # tar -cZf all.tar.Z *.jpg
  這條命令是將所有.jpg的檔案打成一個tar包,並且將其用compress壓縮,生成一個uncompress壓縮過的包,包名為all.tar.Z
  # tar -xZf all.tar.Z
  這條命令是將上面產生的包解開
  有了上面的知識,你應該可以解開多種壓縮檔案了,下面對於tar系列的壓縮檔案作一個小結:
  1)對於.tar結尾的檔案
  tar -xf all.tar
  2)對於.gz結尾的檔案
  gzip -d all.gz
  gunzip all.gz
  3)對於.tgz或.tar.gz結尾的檔案
  tar -xzf all.tar.gz
  tar -xzf all.tgz
  4)對於.bz2結尾的檔案
  bzip2 -d all.bz2
  bunzip2 all.bz2
  5)對於tar.bz2結尾的檔案
  tar -xjf all.tar.bz2
  6)對於.Z結尾的檔案
  uncompress all.Z
  7)對於.tar.Z結尾的檔案
  tar -xZf all.tar.z
  另外對於Window下的常見壓縮檔案.zip和.rar,Linux也有相應的方法來解壓它們:
  1)對於.zip
  linux下提供了zip和unzip程式,zip是壓縮程式,unzip是解壓程式。它們的引數選項很多,這裡只做簡單介紹,依舊舉例說明一下其用法:
  # zip all.zip *.jpg
  這條命令是將所有.jpg的檔案壓縮成一個zip包
  # unzip all.zip
  這條命令是將all.zip中的所有檔案解壓出來
  2)對於.rar
  要在linux下處理.rar檔案,需要安裝RAR for Linux,可以從網上下載,但要記住,RAR for Linux
  不是免費的;然後安裝:
  # tar -xzpvf rarlinux-3.2.0.tar.gz
  # cd rar
  # make
  這樣就安裝好了,安裝後就有了rar和unrar這兩個程式,rar是壓縮程式,unrar是解壓程式。它們的引數選項很多,這裡只做簡單介紹,依舊舉例說明一下其用法:
  # rar a all *.jpg
  這條命令是將所有.jpg的檔案壓縮成一個rar包,名為all.rar,該程式會將.rar 副檔名將自動附加到包名後。
  # unrar e all.rar
  這條命令是將all.rar中的所有檔案解壓出來
  到此為至,我們已經介紹過linux下的tar、gzip、gunzip、bzip2、 bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你應該已經能夠使用它們對.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar這10種壓縮檔案進行解壓了,以後應該不需要為下載了一個軟體而不知道如何在Linux下解開而煩惱了。而且以上方法對於Unix也基本有效。
  總結一下,在linux下 一些壓縮和解壓的常用命令:
  壓縮
  tar –cvf jpg.tar *.jpg //將目錄裡所有jpg檔案打包成tar.jpg
  tar –czf jpg.tar.gz *.jpg //將目錄裡所有jpg檔案打包成jpg.tar後,並且將其用gzip壓縮,生成一個gzip壓縮過的包,命名為jpg.tar.gz
  tar –cjf jpg.tar.bz2 *.jpg //將目錄裡所有jpg檔案打包成jpg.tar後,並且將其用bzip2壓縮,生成一個bzip2壓縮過的包,命名為jpg.tar.bz2
  tar –cZf jpg.tar.Z *.jpg //將目錄裡所有jpg檔案打包成jpg.tar後,並且將其用compress壓縮,生成一個umcompress壓縮過的包,命名為jpg.tar.Z
  rar a jpg.rar *.jpg //rar格式的壓縮,需要先下載rar for linux
  zip jpg.zip *.jpg //zip格式的壓縮,需要先下載zip for linux
  解壓
  tar –xvf file.tar //解壓 tar包
  tar -xzvf file.tar.gz //解壓tar.gz
  tar -xjvf file.tar.bz2 //解壓 tar.bz2
  tar –xZvf file.tar.Z //解壓tar.Z
  unrar e file.rar //解壓rar
  unzip file.zip //解壓zip