从大型 tar.gz 文件中提取单个文件

从大型 tar.gz 文件中提取单个文件

我有一个非常大的 tarball。我会从档案中的数千个文件中提取几个文件。我在 CentOS 6.10 上运行 GPFS 4.2.3。我见过这个答案pigz 在提取整个 tar.ball 时很有用。提取整个 tar ball 是没用的,因为它会占用数 TB 的空间。

我尝试过类似的事情:

$ pigz -dc ../test.tar.gz | tar xf test/analysis/something/dist.txt
tar: test/analysis/something/dist.txt: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

我不太清楚如何在管道输出的上下文中将test/analysis/something/dist.txt作为参数传递给。我的直觉告诉我使用,但这也失败了。tarpigzxargs

$ pigz -dc ../test.tar.gz | xargs -I var | tar xf var test/analysis/something/dist.txt
tar: var: Cannot openxargs: Warning: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?
: No such file or directory
tar: Error is not recoverable: exiting now
xargs: /bin/echo: terminated by signal 13

问题

  1. 如何使用 从大型 tarball 中快速提取单个文件pigz

答案1

您的命令存在问题,您将文件解压缩到 stdout,但不是使用 tar 从 stdin 读取,而是告诉它从不存在的文件中提取。

正确的命令是:

$ pigz -dc ../test.tar.gz | tar xf - test/analysis/something/dist.txt
#                                  ^- this dash tells tar to read from stdin

但是,基本上您是将文件解压缩到内存中,因此,除非您有数 TB 的可用内存,否则它会比解压缩到磁盘更快地填满。

答案2

同意上面作者的观点,只提到 tar 存档内的文件导航:

pigz -dc <archive.tar.gz> | tar xf - <file-with-path-inside-archive>

尝试测试/列出-t您的文件的存档(tar 选项):

pigz -dc <archive.tar.gz> | tar tf -

在档案中查找完整文件名:

pigz -dc <archive.tar.gz> | tar tf - | grep <file-name>

相关内容