系統管理員和開發人員的 15 個 tar 命令示例

已發表: 2021-09-21

tar 是 Unix 和基於 Linux 的系統中可用的流行文件歸檔格式之一。

該名稱本身源自T ape AR chive,因為它是為在磁帶設備上寫入順序數據而開發的。 它有時也被稱為 tarball。

默認情況下,tar 只存檔文件而不壓縮,但使用某些部分。 我們可以使用不同的壓縮技術來獲得壓縮輸出。 tar 實用程序通常默認包含在大多數 Linux 發行版中,並且通過不同的工具和實用程序,其他操作系統(包括 Windows 和 macOS)都支持該格式本身。

我們將在本文中介紹 tar 命令及其支持的標誌的一些常見示例和用法。

那麼讓我們開始吧……

創建 tar 存檔

要創建一個簡單的未壓縮存檔, tar命令的語法是:

 $ tar cvf <tar-file-name> <files-to-archive>

這裡的標誌c代表創建, v代表詳細輸出, f代表指定 tar 存檔文件名。 按照慣例,指定帶有.tar擴展名的 tar 文件名。 要存檔的文件可以使用通配符或單個或多個文件名/路徑指定。

例如,我的目錄中有三個文件:

 $ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

我想創建一個包含所有三個文件的tar存檔,可以這樣做:

 $ tar cvf archive.tar * file1.txt file2.txt file3.txt $ ls -l archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar $

我也可以僅指定要存檔的特定文件,例如:

 $ tar cvf archive1.tar file1.txt file2.txt file1.txt file2.txt $ ls -l archive1.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar $

創建壓縮檔案 (GZ)

tar 不僅可以存檔文件,還可以壓縮它們以節省空間。 一個流行的壓縮格式是gunzip解,通常是由擴展表示.gz.tar或作為tgz 。 我們可以使用z標誌來指定我們需要使用 gunzip 壓縮的文件。 下面是一個例子:

 $ tar cvzf archive.tar.gz file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $

您可以觀察到兩個存檔文件的大小有很大不同,即使它們都包含相同的三個文件。 這是由於使用z標誌進行壓縮。

創建壓縮檔案 (BZ2)

tar 支持其他幾種壓縮格式。 其中之一是bz2bzip2 ,由擴展名tar.bz2或有時表示為tbz2 。 它可能會為您提供更小的存檔大小,但反過來會消耗更多的 CPU,因此壓縮/解壓縮的過程可能比gz存檔慢。

例子:

 $ tar cvjf archive.tar.bz2 file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 12 20:25 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $ file archive.tar* archive.tar: POSIX tar archive (GNU) archive.tar.bz2: bzip2 compressed data, block size = 900k archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10240 $

解壓所有文件

使用x選項可以簡單地提取 tar 存檔(無論是壓縮的還是未壓縮的)。 下面的例子將闡明它的用法:

 $ tar xvf archive.tar file1.txt file2.txt file3.txt $ ls -l total 24 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

這適用於gz壓縮存檔:

 $ tar xvf archive.tar.gz file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

或者甚至對於bz2壓縮存檔為:

 $ tar xvf archive.tar.bz2 file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

列出 tar 內容

要列出 tar 存檔的內容,您可以使用t標誌,如下所示:

 $ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $

解壓特定文件

只有一個文件可以從提取tartar.gztar.bz2通過指定文件名作為檔案:

 $ tar xvf archive.tar.bz2 file1.txt file1.txt $ ls -l total 8 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt $

同樣,您可以指定多個以空格分隔的文件名,以一次性提取它們。

 $ tar xvf archive.tar.bz2 file1.txt file3.txt file1.txt file3.txt $ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

使用通配符解壓

要使用通配符PATTERN提取一個或多個文件,請使用--wildcards標誌:

 $ tar xvf archive.tar.bz2 --wildcards "file*" file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $

將文件添加到存檔

通過使用r--append標誌和新文件名或通配符模式,可以將新文件添加/附加到現有的未壓縮 tarball(請記住,這只適用於未壓縮的.tar文件,不適用於tar.gztar.bz2壓縮格式):

 $ tar rvf archive.tar file-new* file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $

您可以觀察到archive.tar列表內容再次顯示了兩個新添加的文件。

從存檔中刪除文件

可以使用--delete標誌從 tar 存檔中刪除特定文件,如下所示(比較文件刪除前後的 tar 列表):

 $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $ tar --delete -f archive.tar file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt $

同樣,這僅適用於未壓縮的 tarball,對於壓縮存檔格式將失敗。

使用驗證創建

在創建未壓縮的 tar 文件時,您可以使用W標誌驗證存檔的內容:

 $ tar cvfW archive.tar file*.txt file1.txt file2.txt file3.txt Verify file1.txt Verify file2.txt Verify file3.txt $

這不能與壓縮標誌一起使用,儘管您可以稍後使用gzip或其他工具壓縮創建的tar文件。

解壓tar到文件夾

如果要將 tarball 內容解壓縮到特定文件夾而不是當前目錄,請使用-C標誌和目錄路徑,如下所示:

 $ tar xvf archive.tar -C new-directory/ file1.txt file2.txt file3.txt file2.txt file4.txt $ ls -l new-directory/ total 16 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt -rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt $

使用差異標誌

您可以使用--diffd標誌來查找 tar 存檔中的文件與文件系統中的文件之間的任何更改。 這是一個示例,當 tar 內部和外部的文件相同時,該示例運行一次diff 。 更新文件後,它再次運行以顯示輸出的差異。

 $ tar dvf archive.tar file4.txt file4.txt $ $ echo newline > file4.txt $ $ tar dvf archive.tar file4.txt file4.txt file4.txt: Mod time differs file4.txt: Size differs $

排除文件

創建 tar 存檔時可能需要排除特定文件。 這可以通過--exclude標誌來實現。

 $ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/ dir/ dir/file1.txt dir/file3.txt $ ls -l dir total 24 -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt $ tar tvf archive.tar.gz drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/ -rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt -rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt $

從上面的輸出中可以看出,我們可以多次指定--exclude標誌以在AND條件下指定多個文件名或模式。 請注意,在上述示例中dir中的六個文件中,只有兩個文件滿足要包含在archive.at.gz的條件。

查看 tar 內容大小

我們可以使用以下命令獲取壓縮 tar 存檔內容的大小:

 $ tar tvf archive.tar.gz -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xzf archive.tar.gz --to-stdout|wc -c 56 $

同樣對於bz2存檔:

 $ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xjf archive.tar.bz2 --to-stdout|wc -c 56 $

保留權限

默認情況下, tar命令保留正在歸檔的文件和目錄的權限,但您可以使用-p標誌或--preserve-permissions明確指定相同--preserve-permissions ,如下所示:

 $ tar cvpzf archive.tar.gz *.txt file1.txt file2.txt file3.txt $

概括

tar 長期以來一直是 Unix/Linux 系統上的有用實用程序,主要用於歸檔和備份任務。 隨著時間的推移,該實用程序已經發展出許多選項。 它可以用於從簡單到復雜的任務,前提是您知道它提供的功能。 本文介紹了您可以使用tar命令執行的一些基本操作,並展示了它如何幫助您完成日常系統管理任務。

請參閱其手冊頁man tar或使用tar --helptar --usage命令以獲取更多詳細信息。