tar

可以將多個檔案組合成一個名為「tarball」的單個檔案的電腦檔案格式

tarUnix類Unix系統上的歸檔打包工具,可以將多個檔案合併為一個檔案,打包後的檔名亦為「tar」。目前,tar檔案格式已經成為POSIX標準,最初是POSIX.1-1988,目前是POSIX.1-2001。本程式最初的設計目的是將檔案備份到磁帶上(tape archive),因而得名tar。

tar
GNU tar 1.16版顯示出三種常用的Tarball(圖中紅字)
副檔名
.tar
網路媒體型式
application/x-tar
統一類型標識public.tar-archive
格式類型檔案歸檔器
使用容器gzip, bzip2, LZMA, xz, lzop, compress
免費格式?
Tar
開發者GNU計劃
作業系統跨平臺
類型檔案歸檔器
授權條款GNU通用公眾授權條款
網站https://www.gnu.org/software/tar/

版本

常用的tar是自由軟體基金會開發的GNU版,目前的穩定版本是1.33,釋出於2021年1月7日 (2021-01-07)

縮寫

 
Tar經常和別的壓縮方式一起使用,比如gzip,來生成壓縮文件。如圖所示,結合檔案中的檔案被壓縮為一個單位。

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

GNU 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檔案!

常用選項

  • -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執行壓縮或解壓縮。依賴XZ Utils。
  • -z,--gzip,--gunzip,--ungzip 呼叫gzip執行壓縮或解壓縮
  • -Z,--compress,--uncompress 呼叫compress執行壓縮或解壓縮

應用範例

 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這個子目錄。

其他

替代

由於備份策略的進步,逐漸採用dumprestore等工具替代tar。此後,tar多與gzip聯用,彌補後者無法將多個檔案打包的不足。這一用法沿用至今,新的tar版本已能自動呼叫多種壓縮工具執行壓縮。已壓縮的tar檔案也叫「tarball」。大部分自由軟體的原始碼採用tarball的形式釋出。

tar炸彈

攻擊者利用絕對路徑,或者「tar -cf bomb.tar *」的方式建立的tar檔案,然後誘騙受害者在根目錄下解壓,或者使用絕對路徑解壓。可能使受害系統上已有的檔案被覆蓋掉,或者導致當前工作目錄凌亂不堪,這就是所謂的「tar炸彈」。因此,要養成良好的解壓習慣:

  • 解壓前用「t」檢視tar的檔案內容。
  • 拒絕使用絕對路徑。
  • 新建一個臨時子目錄,然後在這個子目錄里解壓。

tar管道

管道用法:

 tar -c "${源目录}" | tar -xvC "${目标目录}"

檔案預設是標準輸入/輸出,不需再額外指定。可以將源目錄下的檔案及子目錄複製到目標目錄中,尤其適用於複製含有特殊檔案(如軟連結裝置檔案)的目錄。

另見

  • JAR:製作的指令相似,但使用的是 ZIP 壓縮。