使用bash从tar.gz文件中提取1个文件

14

是否有可能在不将整个tarball解压到磁盘上的情况下通过编程从相当大的.tar.gz文件中提取单个文件?基本上,我需要通过网络获取大型tar.gz文件并提取1个小文本文件。看起来从磁盘中提取并解压缩tarball,然后提取文件,最后删除其他所有文件似乎有些过度。此外,我将以递归方式执行此操作(例如软件包依赖项,每个文本文件指向更多的tar.gz),因此我能够避免的网络流量和CPU周期越少越好。


1
不,这与Bash有关。而Bash是一种编程语言(某种程度上)。 - Matt Joiner
1
@Matt Joiner:这不是真正与bash相关的问题。这是一个关于常见系统实用程序的使用问题,可以从任何 shell 中调用,而不仅仅是 bash。但是,是的,在 bash 中编程确实是一种编程,尽管有时你可能听到别的说法。 - Cascabel
是的,我考虑过SU,但它在一个相对复杂的bash脚本中,并且将通过机器而不是用户运行,所以我认为它更适合SO而不是SU。 - TJ L
嗯,我个人并不介意;不打算开始什么十字军东征之类的事情。但是我看到很多与编程更相关的问题都被迁移到了SU上。(而且其实,尽管你在用它来编程,答案并不取决于此。)哦好吧。请给我点声望! - Cascabel
好观点。我真的无所谓,那只是我的看法。 - TJ L
2个回答

22

从手册中提取foo.tar.gz中的blah.txt:

tar -xzf foo.tar.gz blah.txt

(当然,这也可以在Superuser上发问,但是快速得到答案也是很好的。)


如果文件位于tar.gz结构内的子目录中,这个代码还能正常工作吗? - TJ L
使用现代版本的GNU tar,您不必在提取时指定“z”选项 - 它会自行推断(对于bzip2压缩文件也是如此)。创建文件时,确实需要选项告诉tar要创建什么 - 因此对称性绝不会有任何害处。 - Jonathan Leffler
1
@tj111:如果tar文件中的文件名为xyz/pqr/abc.txt,那么您需要在命令行中指定这个文件名。您也可以使用shell风格的元字符: xyz/pqr/*可以提取xyz/pqr子目录下的所有文件。只需注意shell是否会为您展开‘*’-使用引号来阻止它这样做即可。 - Jonathan Leffler
@tj111:当然可以。它还会创建目录来容纳单个文件。 - Cascabel
@Jonathan Leffler:是的,没错;我考虑过这个问题,但我想引用手册上的文字。 - Cascabel

4
我 echo Jefromi 的答案,并添加了一个细节,如果您在 tar 文件中有目录,则需要包含文件路径(这对某些人来说可能很明显,但最初我并不清楚如何指定目录结构)。
例如,如果您在 src/ 目录下进行了 tar 操作,并且 blah.txt 位于 release1/shared/ 目录下,则需要返回到 src/ 目录(如果要将其解压缩到相同位置)。
tar -xzf tar.gz release1/shared/blah.txt

如果您不记得tar文件的目录结构(我有点杂乱无章,有时会忘记在哪里打tar包),您可以随时

tar -tzf tar.gz

在了解您的目录结构后,要查看内容,请取消(Ctrl+C)。


谢谢这个。尽管出于某种原因,似乎需要在目录前面加上./才能扫描进入它们。例如:tar -xzf tar.gz ./release1/shared/blah.txt - TJ L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接