在Linux系统,如Ubuntu,以及macOS的终端中,我们经常会遇到tar文件。它们本质上是压缩的档案文件。本文将详细介绍如何提取(或解压缩)tar文件的内容,这些文件也被称为tarball。
.tar.gz 和 .tar.bz2 的含义
扩展名为 .tar.gz 或 .tar.bz2 的文件,都属于压缩的存档文件。而仅有 .tar 扩展名的文件,则通常是未压缩的,不过这种情况比较少见。
.tar 扩展名源于“磁带存档”,这也是为什么这类文件都被称为 tar 文件。tar 命令的历史可追溯到1979年,当时它的创建是为了方便系统管理员将文件存档到磁带上。时至今日,我们依然使用 tar 命令将 tar 文件解压缩到硬盘中。或许在某些地方,依然有人在使用 tar 和磁带进行数据存储。
至于 .gz 或 .bz2 后缀,它们表示存档文件使用了 gzip 或 bzip2 压缩算法进行压缩。 tar 命令可以很好地处理这两种类型的压缩文件,所以采用哪种压缩方法通常并不重要。而且,只要你使用的是 Bash shell,tar 命令就应该可用。你只需要使用合适的 tar 命令行选项。
从 Tar 文件提取文件
假设你下载了两个乐谱文件,分别为 `ukulele_songs.tar.gz` 和 `guitar_songs.tar.bz2`,它们都位于你的下载目录中。
让我们首先提取四弦琴的乐谱:
tar -xvzf ukulele_songs.tar.gz
提取完成后,终端窗口会列出被提取的文件。
我们使用的命令行选项如下:
-x
:表示从 tar 文件中提取或检索文件。-v
:表示详细模式,会列出正在提取的文件。-z
:表示使用 gzip 解压缩 tar 文件。-f
:表示指定要使用的 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 解压缩 tar 文件。-f
:指定要使用的 tar 文件名称。
当我们列出下载目录中的文件时,会发现另一个名为“Guitar Songs”的目录也已创建。
选择提取文件的位置
如果我们希望将文件提取到当前目录之外的其他位置,可以使用 `-C`(指定目录)选项来指定目标目录。
tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/
查看我们的 `Documents/Songs` 目录,会发现 “Guitar Songs” 目录已经被创建。
需要注意的是,目标目录必须预先存在,否则 tar 命令不会自动创建它。如果你需要在一次命令中创建一个目录并将文件解压到其中,可以这样做:
mkdir -p ~/Documents/Songs/Downloaded && tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/Downloaded/
`-p` (parents) 选项使 `mkdir` 命令创建任何必要的父目录,确保目标目录的顺利创建。
在提取 Tar 文件之前查看其内容
到目前为止,我们都是直接提取文件,没有事先查看。你可能更希望在提取之前先了解 tar 文件的内容。你可以使用 `-t` (list) 选项来查看 tar 文件中的内容。通常将输出通过管道传输到 `less` 命令会更加方便。
tar -tf ukulele_songs.tar.gz | less
请注意,列出文件内容时,我们不需要使用 `-z` 选项。只有在从 .tar.gz 文件中提取文件时,才需要添加 `-z` 选项。 同样的,我们也不需要使用 `-j` 选项来列出 tar.bz2 文件中的文件。
滚动查看输出,可以看到 tar 文件中的所有内容都保存在名为 “Ukulele Songs” 的目录中,而该目录内部还包含了其他文件和子目录。
我们可以看到 “Ukulele Songs” 目录中包含 “Random Songs”、 “Ramones” 和 “Possibles” 等子目录。
要从 tar 文件中的某个目录中提取所有文件,请使用以下命令。注意,由于路径中包含空格,所以路径需要用引号引起来。
tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/Ramones/"
要提取单个文件,则需要提供文件的完整路径和名称。
tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/023 - My Babe.odt"
你还可以使用通配符来提取特定的文件,其中 `*` 代表任意字符串,而 `?` 代表任意单个字符。使用通配符时,需要配合 `–wildcards` 选项。
tar -xvz --wildcards -f ukulele_songs.tar.gz "Ukulele Songs/Possibles/B*"
提取文件时不提取目录
如果你不想在硬盘上重建 tar 文件中的目录结构,可以使用 `–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 文件,并进行精细的控制,你只需要记住几个关键选项就足够了。