Answers:
不幸的是,为了解压缩单个.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。
如果您仅从一个大型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。
--occurrence可以在第一个文件上立即启动?我猜这是关于文件名的,所以例如aaaaa.jpg的东西会首先出现?
tar继续在压缩包中搜索找到的文件的较新版本。而是如手册页所述返回the Nth occurrence。如果指定一个在命令行上文件提取和你说--occurrence那么焦油会尽快退出,因为它已经发现的文件,从而有效的阻止“第一个文件。”
处理大型tarball时:
--fast-read仅提取与文件名操作数匹配的第一个存档条目,path/to/file在这种情况下-在tarball中始终是唯一的
tar -xvf file.tgz --fast-read path/to/file
以上将搜索,直到找到匹配项,然后退出