如何在 Linux 上從 .tar.gz 或 .tar.bz2 文件中提取文件
已發表: 2022-01-29
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擴展後綴表示存檔已被壓縮,使用gzip或bzip2壓縮算法。 tar命令可以很好地處理這兩種類型的文件,因此使用哪種壓縮方法並不重要——而且它應該在您擁有 Bash shell 的任何地方都可用。 您只需要使用適當的tar命令行選項。
從 Tar 文件中提取文件
假設您下載了兩個活頁樂譜文件。 一個文件名為ukulele_songs.tar.gz ,另一個文件名為guitar_songs.tar.bz2 。 這些文件位於下載目錄中。

讓我們提取四弦琴歌曲:
tar -xvzf ukulele_songs.tar.gz
提取文件後,它們將列在終端窗口中。

我們使用的命令行選項是:
- -x :從 tar 文件中提取、檢索文件。
- -v :詳細,列出正在提取的文件。
- -z : Gzip,使用 gzip 解壓 tar 文件。
- -f :文件,我們希望
tar使用的 tar 文件的名稱。 此選項後必須跟 tar 文件的名稱。
使用ls列出目錄中的文件,您會看到創建了一個名為 Ukulele Songs 的目錄。 提取的文件位於該目錄中。 這個目錄是從哪裡來的? 它包含在tar文件中,並與文件一起提取。

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

再一次,文件在提取時被列在終端上。 需要明確的是,我們在.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 目錄已創建。

請注意,目標目錄必須已經存在,如果不存在, 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 文件中的所有內容都保存在一個名為 Ukulele Songs 的目錄中,並且在該目錄中,還有文件和其他目錄。

我們可以看到 Ukulele Songs 目錄包含名為 Random Songs、Ramones 和 Possibles 的目錄。
要從 tar 文件中的目錄中提取所有文件,請使用以下命令。 請注意,路徑用引號引起來,因為路徑中有空格。

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

要提取單個文件,請提供文件的路徑和名稱。
tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/023 - My Babe.odt"

您可以使用通配符提取選定的文件,其中*表示任何字符串,而? 代表任何單個字符。 使用通配符需要使用--wildcards選項。
tar -xvz --wildcards -f ukulele_songs.tar.gz "尤克里裡歌曲/可能/B*"

提取文件而不提取目錄
如果您不希望在硬盤驅動器上重新創建 tar 文件中的目錄結構,請使用--strip-components選項。 --strip-components選項需要一個數字參數。 該數字表示要忽略的目錄級別。 仍會提取忽略目錄中的文件,但不會將目錄結構複製到硬盤上。
如果我們在示例 tar 文件中指定--strip-components=1 ,則不會在硬盤驅動器上創建 tar 文件中的 Ukulele Songs 最頂層目錄。 將被提取到該目錄的文件和目錄將被提取到目標目錄中。
tar -xvzf ukulele_songs.tar.gz --strip-components=1

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

如果您查看 Linux 手冊頁,您會發現tar必須是“具有最多命令行選項的命令”標題的理想候選者。 值得慶幸的是,為了讓我們能夠從.tar.gz和tar.bz2文件中提取文件並進行良好的粒度控制,我們只需要記住其中的幾個選項。
| Linux 命令 | ||
| 文件 | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look ·字符串·類型·重命名· zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
| 流程 | 別名· screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat ·超時·牆·是·殺死·睡眠· sudo · su ·時間· groupadd · usermod ·組· lshw ·關機·重啟·暫停·關機· passwd · lscpu · crontab ·日期· bg · fg | |
| 聯網 | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦
