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

TAR文件是压缩的归档文件。在使用像Ubuntu这样的Linux发行版时,甚至在MacOS上使用终端时,您会经常遇到它们。下面介绍如何提取(或解压)tar文件(也称为tarball)的内容。

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

扩展名为.tar.gz或.tar.bz2的文件是压缩存档文件。仅具有.tar扩展名的文件是解压缩的,但这种情况非常少见。

文件扩展名的.tar部分代表磁带存档,这也是这两种文件类型都称为tar文件的原因。tar文件可以一直追溯到1979年,当时创建tar命令是为了允许系统管理员将文件存档到磁带上。40年后,我们仍然在使用tar命令将tar文件解压到硬盘上。可能某个地方的人还在用胶带涂焦油。

.gz或.bz2扩展名后缀表示存档已使用gzip或bzip2压缩算法进行压缩。*tar命令可以很好地处理这两种类型的文件,因此使用哪种压缩方法并不重要-而且它应该在您拥有Bash shell的任何地方都可用。您只需使用适当的tar命令行选项即可。

从Tar文件中提取文件

假设您下载了两个乐谱文件。一个文件名为ukulele_songs.tar.gz,另一个文件名为giitar_songs.tar.bz2。这些文件位于下载目录中。

让我们摘录尤克里里的歌曲:

tar -xvzf ukulele_songs.tar.gz

解压文件时,它们会在终端窗口中列出。

我们使用的命令行选项包括:

-x:从tar文件中提取、检索文件。 -v:Verbose,在提取文件时列出这些文件。 -z:gzip,使用gzip解压tar文件。 -f:file,我们希望tar使用的tar文件的名称。此选项后面必须跟TAR文件的名称。

使用ls列出目录中的文件,您将看到已经创建了一个名为Ukulele sones的目录。解压缩的文件位于该目录中。这个目录是从哪里来的?它包含在tar文件中,并与文件一起解压。

现在让我们摘录吉他歌曲。为此,我们将使用与前面几乎完全相同的命令,但有一个重要的区别。.bz2扩展名后缀告诉我们它已使用bzip2命令压缩。我们将不使用-z(Gzip)选项,而使用-j(Bzip2)选项。

tar -xvjf guitar_songs.tar.bz2

同样,在提取文件时,会将文件列出到终端。需要明确的是,我们与.tar.bz2文件的tar一起使用的命令行选项是:

-x:从tar文件中提取、检索文件。 -v:Verbose,在提取文件时列出这些文件。 -j:bzip2,使用bzip2解压tar文件。 -f:file,我们希望tar使用的tar文件的名称。

如果我们列出下载目录中的文件,我们将看到已经创建了另一个名为Guitar歌曲的目录。

选择将文件解压缩到的位置

如果我们希望将文件解压缩到当前目录以外的位置,可以使用-C(指定目录)选项指定目标目录。

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

查看我们的文档/歌曲目录,我们会看到已经创建了Guitar歌曲目录。

请注意,目标目录必须已经存在,如果不存在,tar将不会创建它。如果您需要创建一个目录,并让tar在一个命令中将所有文件解压缩到其中,您可以执行以下操作:

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

p目录(父目录)选项使mkdir创建所需的任何父目录,从而确保创建了目标目录。

在解压缩之前查看焦油文件内部

到目前为止,我们刚刚冒了一次险,提取了看不见的文件。你最好三思而后行。在解压tar文件之前,您可以使用-t(List)选项查看它的内容。通过less命令通过管道输出通常很方便。

tar -tf ukulele_songs.tar.gz | less

注意,我们不需要使用-z选项来列出文件。我们只需要在从.tar.gz文件提取文件时添加-z选项。同样,我们不需要-j选项来列出tar.bz2文件中的文件。

滚动查看输出,我们可以看到tar文件中的所有内容都保存在一个名为Ukulele歌曲的目录中,并且在该目录中有文件和其他目录。

我们可以看到,Ukulele歌曲目录包含称为随机歌曲、雷蒙斯和Possible的目录。

要从tar文件中的目录中提取所有文件,请使用以下命令。请注意,路径用引号括起来,因为路径中有空格。

tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/Ramones/"

要解压缩单个文件,请提供文件的路径和名称。

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

您可以使用通配符提取选定的文件,其中*表示任意字符串,?表示任何单个字符。使用通配符需要使用--通配符选项。

tar -xvz --wildcards -f ukulele_songs.tar.gz "Ukulele Songs/Possibles/B*"

在不解压缩目录的情况下解压缩文件

如果不希望在硬盘上重新创建tar文件中的目录结构,请使用--strie-component选项。--strie-component选项需要数字参数。该数字表示要忽略的目录级数。仍会提取忽略目录中的文件,但不会将目录结构复制到硬盘上。

如果我们在示例tar文件中指定--strie-component=1,则不会在硬盘上创建tar文件中最顶层的Ukulele歌曲目录。本应解压到该目录的文件和目录将在目标目录中解压。

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

我们的示例tar文件中只有两级目录嵌套。因此,如果我们使用--strie-component=2,那么所有文件都会被解压到目标目录中,并且不会创建任何其他目录。

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

如果您查看Linux的手册页,您会发现tar肯定是标题“具有最多命令行选项的命令”的一个很好的候选者。值得庆幸的是,要允许我们从.tar.gz和tar.bz2文件中提取文件并进行良好的粒度控制,我们只需要记住这些选项中的一小部分。

相关文章