如何在 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 ·查看·字符串·类型·重命名· zip ·解压缩· mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
| 流程 | 别名· screen · top · nice · renice ·进度· 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 笔记本电脑
