複製鏈接
請複製以下鏈接發送給好友

Tar

(Linux系統命令)

鎖定
Unix和類Unix系統上的壓縮打包工具,可以將多個文件合併為一個文件,打包後的文件後綴亦為“tar”。tar文件格式已經成為POSIX標準,最初是POSIX.1-1988,當前是POSIX.1-2001。最初的設計目的是將文件備份到磁帶上(tape archive),因而得名tar。
谷歌 ChromeOS 在管理文件方面進行了改進,新增了對 tar 格式的支持,將在 2022年8 月的 ChromeOS 104 推出。 [2] 
外文名
Tar
格    式
tar [主選項+輔選項] 文件或目錄
所屬系統
Unix/Linux系統
類    型
備份文件的可靠方法

Tar版本

常用的tar是自由軟件基金會開發的GNU版,穩定版本是1.28,發佈於2014年7月27日
同時,它有多個壓縮率不同的版本,如tar.xz和tar.gz,前者的壓縮率更高,但可能有兼容性問題。

Tar作用

tar命令是Unix/Linux系統中備份文件的可靠方法,幾乎可以工作於任何環境中,它的使用權限是所有用户。 [1] 

Tar縮寫

tar代表未壓縮的tar文件。已壓縮的tar文件則附加壓縮文件的擴展名,如經過gzip壓縮後的tar文件,擴展名為“.tar.gz”。由於受到DOS8.3文件名格式的限制,常使用下列縮寫:
  • .tgz等價於.tar.gz
  • .tbz與tb2等價於.tar.bz2
  • .taz等價於.tar.Z
  • .tlz等價於.tar.lzma
  • .txz等價於.tar.xz

TarGNU tar的用法

命令格式是:tar 功能 選項 文件
可以將代表功能和選項的單個字母合併;當使用單個字母時,可以不用在字母前面加“-”。某些版本的tar要求嚴格按照功能字、選項字的順序,而有些版本的tar並不在意這個順序。

Tar功能

  • -c,--create 創建新的tar文件
  • -x,--extract,--get 解開tar文件
  • -t,--list 列出tar文件中包含的文件的信息
  • -r,--append 附加新的文件到tar文件中
  • -u,--update 用已打包的文件的較新版本更新tar文件
  • -A,--catenate,--concatenate 將tar文件作為一個整體追加到另一個tar文件中
  • -d,--diff,--compare 將文件系統裏的文件和tar文件裏的文件進行比較
  • --delete 刪除tar文件裏的文件。注意,這個功能不能用於已保存在磁帶上的tar文件。

Tar常用選項

  • -v,--verbose 列出每一步處理涉及的文件的信息,只用一個“v”時,僅列出文件名,使用兩個“v”時,列出權限、所有者、大小、時間、文件名等信息。
  • -k,--keep-old-files 不覆蓋文件系統上已有的文件。
  • -f,--file [主機名:]文件名 指定要處理的文件名。可以用“-”代表標準輸出或標準輸入。
  • -P,--absolute-names 使用絕對路徑
  • -j,--bzip2 調用bzip2執行壓縮或解壓縮。注意,由於部分老版本的tar使用-I實現本功能,因此,編寫腳本時,最好使用--bzip2。
  • -J,--xz,--lzma 調用XZ Utils執行壓縮或解壓縮。依賴XZ Utils。
  • -z,--gzip,--gunzip,--ungzip 調用gzip執行壓縮或解壓縮。
  • -Z,--compress,--uncompress 調用compress執行壓縮或解壓縮。

Tar主要參數

使用該命令時,主選項是必須要有的,它告訴tar要做什麼事情,輔選項是輔助使用的,可以選用。

Tar主選項

-c 創建新的檔案文件。如果用户想備份一個目錄或是一些文件,就要選擇這個選項。
-r 把要存檔的文件追加到檔案文件的末尾。例如用户已經做好備份文件,又發現還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。
-t 列出檔案文件的內容,查看已經備份了哪些文件。
-u 更新文件。就是説,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最後。
-x 從檔案文件中釋放文件。
3.2 輔助選項:
-b 該選項是為磁帶機設定的,其後跟一數字,用來説明區塊的大小,系統預設值為20(20×512 bytes)。
-f 使用檔案文件或設備,這個選項通常是必選的。
-k 保存已經存在的文件。例如把某個文件還原,在還原的過程中遇到相同的文件,不會進行覆蓋。
-m 在還原文件時,把所有文件的修改時間設定為。
-M 創建多卷的檔案文件,以便在幾個磁盤中存放。
-v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。
-w 每一步都要求確認。
-j 代表使用‘bzip2’程序進行文件的壓縮
-J代表調用“xz”程序進行文件的壓縮(但在RHEL5的1.53上面無法使用,在RHEL6的2.23上面可以使用)
-z 用gzip來壓縮/解壓縮文件,加上該選項後可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。
-A,--catenate,--concatenate
將一存檔與已有的存檔合併
-d,--diff,--compare
比較存檔與當前文件的不同之處
--delete
從存檔中刪除
其他參數
--atime-preserve
不改變轉儲文件的存取時間
-b,--block-size N
指定塊大小為 Nx512 字節(缺省時 N=20)
-B,--read-full-blocks
讀取時重組塊
-C,--directory DIR
轉到指定的目錄
--checkpoint
讀取存檔時顯示目錄名
-f,--file [HOSTNAME:]F
指定存檔或設備 (缺省為 /dev/rmt0)
--force-local
強制使用本地存檔,即使存在克隆
-F,--info-script F --new-volume-script F
在每個磁盤結尾使用腳本 F (隱含 -M)
-G,--incremental
建立老 GNU 格式的備份
-g,--listed-incremental F
建立新 GNU 格式的備份
-h,--dereference
不轉儲動態鏈接,轉儲動態鏈接指向的文件。
-i,--ignore-zeros
忽略存檔中的 0 字節塊(通常意味着文件結束)
--ignore-failed-read
當遇上不可讀文件時不要以非零值退出
-k,--keep-old-files
保存現有文件;從存檔中展開時不進行覆蓋
-K,--starting-file F
從存檔文件 F 開始
-l,--one-file-system
在本地文件系統中創建存檔
-L,--tape-length N
在寫入 N*1024 個字節後暫停,等待更換磁盤
-m,--modification-time
當從一個檔案中恢復文件時,不使用新的時間標籤
-M,--multi-volume
建立多卷存檔,以便在幾個磁盤中存放
-N,--after-date DATE,--newer DATE
僅存儲時間較新的文件
-o,--old-archive,--portability
以 V7 格式存檔,不用 ANSI 格式
-O,--to-stdout
將文件展開到標準輸出
-p,--same-permissions,--preserve-permissions
展開所有保護信息
-P,--absolute-paths
不要從文件名中去除 '/'
--preserve
like -p -s
與 -p -s 相似
-R,--record-number
顯示信息時同時顯示存檔中的記錄數
--remove-files
建立存檔後刪除源文件
-s,--same-order,--preserve-order
為解壓至匹配歸檔排序名稱
--same-owner
展開以後使所有文件屬於同一所有者
-S,--sparse
高效處理
-T,--files-from F
從文件中得到要展開或要創建的文件名
--null
讀取空結束的文件名,使 -C 失效
--totals
顯示用 --create 參數寫入的總字節數
-v,--verbose
詳細顯示處理的文件
-V,--label NAME
為存檔指定卷標
--version
顯示 tar 程序的版本號
-w,--interactive,--confirmation
每個操作都要求確認
-W,--verify
寫入存檔後進行校驗
--exclude FILE
不把指定文件包含在內
-X,--exclude-from FILE
從指定文件中讀入不想包含的文件的列表
-y,--bzip2,--bunzip2
用 bzip2 對存檔壓縮或解壓
-Z,--compress,--uncompress
用 compress 對存檔壓縮或解壓
-z,--gzip,--ungzip
用 gzip 對存檔壓縮或解壓
--use-compress-program PROG
用 PROG 對存檔壓縮或解壓 ( PROG 需能接受 -d 參數)
--block-compress
為便於磁盤存儲,按塊記錄存檔
-[0-7][lmh]
指定驅動器和密度[低中高]
例如:
  1. 將當前目錄下所有.txt文件打包並壓縮歸檔到文件this.tar.gz,可以使用
tar zcvf this.tar.gz ./*.txt
2.將當前目錄下的this.tar.gz中的文件解壓到當前目錄,可以使用
tar xzvf this.tar.gz ./
windows下支持TAR格式的軟件有WinMount等。

Tar應用示例

tar -cvf home_backup.tar /home
可以將/home目錄下的所有文件打包入home_backup.tar文件中。理解這個命令時,請注意“home_backup.tar”實際上是-f選項的參數。tar默認記錄相對路徑,即使給出的是絕對路徑,也會自動將代表根目錄的“/”去掉,所以,在這個例子中,使用“/home”和“home”是相同的。要想使用絕對路徑,請加上“P”選項,但一般不推薦使用絕對路徑,原因之一是可能導致tar炸彈攻擊。
cd /home tar -cvf home_backup.tar *
這也是一種製作備份的方法,但是不推薦這樣做。因為tar在默認解壓時,會將文件直接輸出到當前目錄下,而不會新建並輸出到一個名為home的子目錄,令到當前目錄顯得很凌亂。這也是一種形式的tar炸彈攻擊。
tar -tf home_backup.tar
列出home_backup.tar文件裏已被打包的文件。此時僅僅顯示文件名。如果加上“v”,則能列出權限、所有者、大小、時間、文件名等信息。為防止tar炸彈攻擊,應該養成解壓前查看tar文件內容的好習慣。
tar -xvf home_backup.tar
在當前目錄下解壓home_back.tar。解壓後的文件,其訪問權限得到保留;其所有者是執行tar命令的用户,如果tar的執行者是root,則所有者是文件原來的所有者。 解壓前,最好先查看tar文件的內容,以決定是否需要新建一個臨時子目錄安放。
tar -xvf home_backup.tar home/test.c
指定解壓出test.c這個文件。解壓過程中會自動創建home這個子目錄。

Tar其他

由於備份策略的進步,逐漸採用dump、restore等工具替代tar。此後,tar多與gzip聯用,彌補後者無法將多個文件打包的不足。這一用法沿用至今,新的tar版本已能自動調用多種壓縮工具執行壓縮。已壓縮的tar文件也叫“tarball”。大部分自由軟件的源代碼採用tarball的形式發佈。 [3] 
tar炸彈
攻擊者利用絕對路徑,或者“tar -cf bomb.tar *”的方式創建的tar文件,然後誘騙受害者在根目錄下解壓,或者使用絕對路徑解壓。可能使受害系統上已有的文件被覆蓋掉,或者導致當前工作目錄凌亂不堪,這就是所謂的“tar炸彈”。因此,要養成良好的解壓習慣: [3] 
  • 解壓前用“t”查看tar的文件內容。
  • 拒絕使用絕對路徑。
  • 新建一個臨時子目錄,然後在這個子目錄裏解壓。
tar管道
管道用法: [3] 
tar -c "${源目錄}" | tar -xvC "${目標目錄}"
文件默認是標準輸入/輸出,不需再額外指定。 可以將源目錄下的文件及子目錄複製到目標目錄中,尤其適用於複製含有特殊文件(如軟鏈接、設備文件)的目錄。
參考資料