如何从tar.gz中提取特定文件


104

我们如何从大型tar.gz文件中提取特定文件?我在此问题中找到了从tar中提取文件的过程,但是,当我在其中尝试上述命令时,出现了错误:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

然后如何从中提取文件tar.gz


请注意,任何解决方案都必须首先解压缩整个存档:superuser.com/questions/655739/…如果要避免这种情况,则需要使用其他格式,例如zip。ZIP将提供较少的压缩,因为它会分别压缩单个文件:superuser.com/questions/1013309/…我想知道是否存在一种既支持速度又能够提取单个文件的格式。
Ciro Santilli新疆改造中心法轮功六四事件

Answers:


119

您也可以使用 tar -zxvf <tar filename> <file you want to extract>

您必须正确tar ztf test.tar.gz显示文件名。如果显示例如./extract11,或some/bunch/of/dirs/extract11,那就是您要提供的(文件将以该名称显示,将自动创建所需的目录)。

  • -x:指示tar解压缩文件。
  • -f:指定文件名/压缩包名称。
  • -v:详细(提取文件时显示进度)。
  • -z:通过gzip过滤归档文件,用于解压缩.gz文件。

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
然后尝试执行此操作。tar tf archive.tar.gz | grep extract11请检查
extract11

8
您必须正确tar ztf test.tar.gz显示文件名。如果显示例如./extract11,或some/bunch/of/dirs/extract11,那就是您要提供的(文件将以该名称显示,将自动创建所需的目录)。
vonbrand

我想在此处添加一点,该-z选项在某些版本的UNIX(例如HP-UX)中不起作用。
Ankit Vashistha

1
@ pj-brunet:否,f不能以结尾结尾。但必须紧随其后的是文件名。此示例与tar名称后面的所有其他选项一起正常运行:tar -f mytar.tar.gz -zxv dir/somefile。它从“ mytar.tar.gz”中提取“ dir / somefile”。
mivk

34

假设您有一个名为tar的tar,lotsofdata.tar.gz并且只知道其中有一个文件,但您所能记住的只是它的名称包含单词contract。您有两种选择:

您可以使用targrep列出tarball的内容,以便找出与您所知道的部分相匹配的所有文件的完整路径和名称,然后在您知道tar一个文件的确切详细信息之后用于提取该文件,或者您可以使用两个文件鲜为人知的开关仅提取与您鲜为人知的文件名相匹配的所有文件-您无需知道此选项的全名或路径的任何部分。详细信息是:

选项1

$ tar -tzf lotsofdata.tar.gz | grep contract

这将列出名称中包含您已知部分的所有文件的详细信息。然后,使用以下命令提取所需内容:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

您可能需要./先行一步才能使其正常工作。

选项2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

取决于您,您会发现更容易或最有用。


德拉特 最后一条命令的错字:我复制了-xzf。这些开关应该只有一个实例。
Wendy Cricks

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>./全路径开始时为我工作并给予了帮助
user13107 '17

您可能需要耐心等待一段时间,这也许很明显,但是它将提取当前目录中的完整目录结构,即使这些目录尚不存在。
PJ Brunet '18

BSD tar(至少在macOS上)不支持该--wildcards选项。我仍然可以与取得类似的行为-x -O *foo*foo在我的情况下是文件名glob,因为我知道文件以foo结尾。
Eric Hu

6

前几天,我试图从压缩包中提取几百个文件,而上千个文件。单个通配符无法引用我需要的文件。因此,我用Google搜索并找到了此页面。

但是,上面的技巧似乎都不适合我的任务。我最后读了这个人,找到了这个选项--files-from,所以我的最终解决方案是

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

它就像一个魅力。

更新:列表文件的格式应与从中看到的格式相同tar -tvf,否则将无法提取任何文件。


2

如果省略括号,您的示例对我有用

$ tar --extract --file=test.tar.gz extract11

如果文件extract11在子文件夹中,则应在tarball中指定路径。

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

然后,令人沮丧的是extract11不在tar文件中。确保需要提供相对路径。参见编辑
Bernhard 2013年

1

请在下面找到从tar.gz文件中提取特定文件的示例。

从本地文件:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

从远程URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.