如何在Linux上从.tar.gz或者.tar.bz2文件提取文件
Tar文件是压缩的存档。在使用Linux发行版(例如Ubuntu)或者在macOS上使用终端时,我们会经常遇到它们。这是提取或者解压缩tar文件(也称为tar包)内容的方法。
.tar.gz和.tar.bz2是什么意思?
扩展名为.tar.gz或者.tar.bz2的文件是压缩存档文件。扩展名为.tar的文件不会被压缩,但是这种情况很少见。
文件扩展名的" .tar"部分代表磁带存档,这是这两种文件类型都称为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命令进行了压缩。代替使用-z(gzip)选项,我们将使用-j(bzip2)选项。
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
(list)选项解压缩tar
文件之前,可以查看它的内容。通常通过less
命令通过管道传递输出是很方便的。
tar -tf ukulele_songs.tar.gz | less
注意,我们不需要使用-z选项来列出文件。从.tar.gz文件中提取文件时,只需添加-z选项。同样,我们不需要-j选项就可以在tar.bz2文件中列出文件。
滚动查看输出,我们可以看到tar文件中的所有内容都保存在名为Ukulele Songs的目录中,并且在该目录中有文件和其他目录。
我们可以看到,Ukulele歌曲目录包含名为"随机歌曲"," Ramones"和"可能性"的目录。
要从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选项。 " --strip-components"选项需要一个数字参数。该数字表示要忽略的目录级别。仍然会从被忽略的目录中提取文件,但目录结构不会复制到硬盘驱动器上。
如果我们在示例tar文件中指定--strip-components = 1
,则tar文件中的Ukulele Songs最顶层目录不会在硬盘上创建。本应提取到该目录的文件和目录将提取到目标目录中。
tar -xvzf ukulele_songs.tar.gz --strip-components=1
示例tar文件中只有两层目录嵌套。因此,如果我们使用--trips-components = 2,则所有文件都提取到目标目录中,而不会创建其他目录。
tar -xvzf ukulele_songs.tar.gz --strip-components=2