从巨大的tgz文件中提取单个文件


19

我有一个巨大的tar文件(大约500G),并且我不想从中提取一个文件。
但是,当我运行时tar -xvf file.tgz path/to/file,似乎仍将全部内容加载到内存中,并且需要一个多小时来提取内容。我还尝试使用--exclude=ignore.txtignore.txt是模式列表的位置,以试图阻止它遍历无效的路径,但这似乎不起作用。

也许我听不懂tar ...有没有办法快速提取文件?


我想知道同样的事情。我正在寻找的文件很快被找到并提取了-然后我需要等待一个小时来处理其余的成就:o(
maasha

Answers:


14

不幸的是,为了解压缩单个.tar.gz存档文件,您必须处理整个存档,而您无能为力。

这是归档文件.zip(和其他格式,例如.rar)工作得更好的地方,因为zip格式文件中包含所有文件的中央目录,并且直接偏移指向zip文件的中间,因此可以快速提取归档文件成员而无需处理整个内容。

您可能会问,为什么处理.tar.gz如此缓慢?

.tar.gz(通常简称为.tgz)只是通过.tar压缩器gzip压缩后存档。gzip是只能使用一个文件的流式压缩器。如果你想获得的任何部分gzip流,您需要解压缩它作为一个整体,这是真正杀死它.tar.gz(和.tar.bz2.tar.xz和其他类似的格式基础上.tar)。

.tar格式实际上非常非常简单。它只是一个512字节的文件或目录标头(名称,大小等)的流,每个标头后跟文件或目录的内容(如有必要,以0字节填充为512块大小)。当您观察到标题的总512块为空时,表示.tar归档结束。

有些人认为,即使.tar归档成员不能快速访问,但这不是真实。如果.tar存档中包含很少的大文件,则实际上您可以快速查找下一个标头,因此您可以在很少的查找中找到必要的存档成员(但仍然可能需要与存档成员一样多的查找)。如果您的.tar归档文件包含许多小文件,这意味着即使未压缩也无法进行快速成员检索.tar


3
gzip可以流式传输未压缩的数据,而不必撤消整个操作。但是,由于.tar是磁带存档的缩写,因此您需要遍历整个文件,直到找到所需的文件为止。尽管tar会继续查找,因为可能还会有另一个,但稍后会在tar文件中进行复制。
kurtm

9

如果您仅从一个大型tar文件中提取一个文件,则说明您使用的是GNU tar并且可以保证tar文件从未附加到该文件中,那么您可以使用来显着提高性能--occurrence

此选项告诉tar一旦找到您所请求的每个文件的第一个匹配项,便立即停止。

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

找到passwd和的每个副本后,它不会在整个tarball中后台打印shadow,而是停止。如果这些文件出现在末尾,则性能提升不会很大,但是,即使它们出现在500G文件的一半时,您也可以节省很多时间。

对于使用tar单次备份而不使用真实磁带机的人们,这种情况可能是典型的情况。

请注意,您还可以传递--occurrence=NUMBER以检索每个文件的第NUMBER个实例,如果您知道存档中多个版本,这将很有帮助。默认情况下,该行为等于NUMBER1的a。


有没有一种创建tar的方法,以便首先生成特定文件?这样就--occurrence可以在第一个文件上立即启动?我猜这是关于文件名的,所以例如aaaaa.jpg的东西会首先出现?
杰夫,

1
@杰夫:不是。这只是阻止tar继续在压缩包中搜索找到的文件的较新版本。而是如手册页所述返回the Nth occurrence。如果指定一个在命令行上文件提取你说--occurrence那么焦油会尽快退出,因为它已经发现的文件,从而有效的阻止“第一个文件。”
phogg

1

不幸的是,tar文件格式不包含集中的目录-因此必须按顺序读取存档以查找特定文件。它最初是为磁带备份而设计的(“ tar”来自t ape ar chive),在任何情况下都不支持这种操作。

因此,您可能只需要等待。


1

处理大型tarball时:

--fast-read仅提取与文件名操作数匹配的第一个存档条目,path/to/file在这种情况下-在tarball中始终是唯一的

tar -xvf file.tgz --fast-read path/to/file

以上将搜索,直到找到匹配项,然后退出


1
我想了解为什么仍然是0点。man tar(GNU tar 1.29)甚至不打印此选项。但是Ubuntu似乎默认启用了它。快速阅读,我不确定--fast-read与的不同之处--occurrence。但是然后--occurrence甚至不在Ubuntu页面上,而是在中man tar。是--fast-read--occurrence同一件事可能吗?
杰夫,

这些选项都不是由标准指定的,并且与非标准选项一样,必须小心以确保系统上的实用程序支持它们。GNU tar支持--occurrences选项。FreeBSD tar的最新版本支持--fast-read选项,Ubuntu将其打包为bsdtar。看到这里更多。
phogg
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.