如何在 Linux 上從 .tar.gz 或 .tar.bz2 文件中提取文件

已發表: 2022-01-29
Unity 桌面概念上的 Bash shell
Fatmawati Achmad Zaenuri/Shutterstock.com

Tar 文件是壓縮檔案。 在使用 Ubuntu 等 Linux 發行版甚至在 macOS 上使用終端時,您會經常遇到它們。 下面介紹如何提取或解壓縮 tar 文件(也稱為 tarball)的內容。

.tar.gz 和 .tar.bz2 是什麼意思?

具有.tar.gz.tar.bz2擴展名的文件是壓縮存檔文件。 只有.tar擴展名的文件是未壓縮的,但這種情況非常罕見。

文件擴展名的.tar部分代表 tape ar cive ,這也是這兩種文件類型都被稱為 tar 文件的原因。 tar 文件的歷史可以追溯到 1979 年,當時創建了tar命令以允許系統管理員將文件存檔到磁帶上。 四十年後,我們仍在使用tar命令將 tar 文件解壓到硬盤上。 某個地方的某個人可能仍在使用tar和磁帶。

.gz.bz2擴展後綴表示存檔已被壓縮,使用gzipbzip2壓縮算法。 tar命令可以很好地處理這兩種類型的文件,因此使用哪種壓縮方法並不重要——而且它應該在您擁有 Bash shell 的任何地方都可用。 您只需要使用適當的tar命令行選項。

從 Tar 文件中提取文件

假設您下載了兩個活頁樂譜文件。 一個文件名為ukulele_songs.tar.gz ,另一個文件名為guitar_songs.tar.bz2 。 這些文件位於下載目錄中。

下載目錄下的兩個tar文件

讓我們提取四弦琴歌曲:

 tar -xvzf ukulele_songs.tar.gz
廣告

提取文件後,它們將列在終端窗口中。

從 tar 文件中提取所有文件

我們使用的命令行選項是:

  • -x :從 tar 文件中提取、檢索文件。
  • -v :詳細,列出正在提取的文件。
  • -z : Gzip,使用 gzip 解壓 tar 文件。
  • -f :文件,我們希望tar使用的 tar 文件的名稱。 此選項後必須跟 tar 文件的名稱。

使用ls列出目錄中的文件,您會看到創建了一個名為 Ukulele Songs 的目錄。 提取的文件位於該目錄中。 這個目錄是從哪裡來的? 它包含在tar文件中,並與文件一起提取。

在 Downloads 目錄中創建的 Ukulele Songs 目錄

現在讓我們提取吉他歌曲。 為此,我們將使用與以前幾乎完全相同的命令,但有一個重要區別。 .bz2擴展名後綴告訴我們它已使用 bzip2 命令壓縮。 我們將使用-j (bzip2) 選項,而不是使用-z (gzip) 選項。

 tar -xvjf guitar_songs.tar.bz2 

提取下載文件夾中的吉他歌曲 tar 文件

再一次,文件在提取時被列在終端上。 需要明確的是,我們在.tar.bz2文件中使用tar的命令行選項是:

  • -x :從 tar 文件中提取、檢索文件。
  • -v :詳細,列出正在提取的文件。
  • -j :bzip2,使用bzip2解壓tar文件。
  • -f :文件,我們希望 tar 使用的 tar 文件的名稱。

如果我們列出下載目錄中的文件,我們將看到另一個名為 Guitar Songs 的目錄已創建。

在下載目錄中創建的吉他歌曲目錄

選擇將文件提取到的位置

如果我們想將文件提取到當前目錄以外的位置,我們可以使用-C (指定目錄)選項指定目標目錄。

 tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/
廣告

查看我們的 Documents/Songs 目錄,我們將看到 Guitar Songs 目錄已創建。

在 Documents/Songs 目錄中創建的吉他歌曲目錄

請注意,目標目錄必須已經存在,如果不存在, tar將不會創建它。 如果您需要創建一個目錄並讓tar在一個命令中將文件全部解壓到其中,您可以按如下方式進行:

 mkdir -p ~/Documents/Songs/Downloaded && tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/Downloaded/

-p (parents) 選項使mkdir創建所需的任何父目錄,確保創建目標目錄。

在提取 Tar 文件之前查看它們

到目前為止,我們剛剛邁出了信心的一步,並在看不見的情況下提取了文件。 您可能想在跳躍之前先看看。 您可以使用-t (列表)選項在提取tar文件之前查看它的內容。 通過less命令管道輸出通常很方便。

 tar -tf ukulele_songs.tar.gz | 較少的

請注意,我們不需要使用-z選項來列出文件。 我們只需要在從.tar.gz文件中提取文件時添加-z選項。 同樣,我們不需要-j選項來列出tar.bz2文件中的文件。

通過較少管道傳輸的 tar 文件的內容

滾動查看輸出,我們可以看到 tar 文件中的所有內容都保存在一個名為 Ukulele Songs 的目錄中,並且在該目錄中,還有文件和其他目錄。

通過較少管道傳輸的 tar 文件內容的第二個視圖

廣告

我們可以看到 Ukulele Songs 目錄包含名為 Random Songs、Ramones 和 Possibles 的目錄。

要從 tar 文件中的目錄中提取所有文件,請使用以下命令。 請注意,路徑用引號引起來,因為路徑中有空格。

 tar -xvzf ukulele_songs.tar.gz "尤克里裡歌曲/Ramones/" 

從 tar 文件中提取單個文件夾

要提取單個文件,請提供文件的路徑和名稱。

 tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/023 - My Babe.odt" 

從 tar 文件中提取單個文件

您可以使用通配符提取選定的文件,其中*表示任何字符串,而? 代表任何單個字符。 使用通配符需要使用--wildcards選項。

 tar -xvz --wildcards -f ukulele_songs.tar.gz "尤克里裡歌曲/可能/B*" 

使用通配符從 tar 中提取歌曲

提取文件而不提取目錄

如果您不希望在硬盤驅動器上重新創建 tar 文件中的目錄結構,請使用--strip-components選項。 --strip-components選項需要一個數字參數。 該數字表示要忽略的目錄級別。 仍會提取忽略目錄中的文件,但不會將目錄結構複製到硬盤上。

如果我們在示例 tar 文件中指定--strip-components=1 ,則不會在硬盤驅動器上創建 tar 文件中的 Ukulele Songs 最頂層目錄。 將被提取到該目錄的文件和目錄將被提取到目標目錄中。

 tar -xvzf ukulele_songs.tar.gz --strip-components=1 

使用 --strip-components=1 從 tar 文件中提取文件

廣告

在我們的示例 tar 文件中只有兩級目錄嵌套。 所以如果我們使用--strip-components=2 ,所有文件都被提取到目標目錄中,並且不會創建其他目錄。

 tar -xvzf ukulele_songs.tar.gz --strip-components=2 

使用 --strip-components=2 從 tar 文件中提取文件

如果您查看 Linux 手冊頁,您會發現tar必須是“具有最多命令行選項的命令”標題的理想候選者。 值得慶幸的是,為了讓我們能夠從.tar.gztar.bz2文件中提取文件並進行良好的粒度控制,我們只需要記住其中的幾個選項。

相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦