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

Bri*_*ian 20 linux tar

我有一个巨大的 tar 文件(大约 500G),我不想从中提取一个文件。
但是,当我运行时,tar -xvf file.tgz path/to/file它似乎仍在将整个内容加载到内存中,并且需要一个多小时才能提取。我还尝试使用--exclude=ignore.txtwhere ignore.txt is list of patterns 试图阻止它遍历无用的路径,但这似乎不起作用。

可能是我看不懂 tar... 有没有办法快速解压文件?

mvp*_*mvp 16

不幸的是,为了解压缩.tar.gz档案的单个成员,您必须处理整个档案,而您无能为力来修复它。

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

你可能会问为什么处理.tar.gz这么慢?

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

.tar格式其实非常非常简单。它只是 512 字节文件或目录头(名称、大小等)的流,每个头后跟文件或目录内容(如有必要,用 0 字节填充到 512 块大小)。当您观察到标题的 512 块完全为空时,这意味着.tar存档结束。

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

  • gzip 可以流式传输未压缩的数据,它不必撤消整个过程。但是,由于 .tar 是磁带存档的缩写,因此您确实需要遍历整个文件,直到找到您要查找的文件。虽然 tar 会继续查找,因为可能还有另一个,稍后在 tar 文件中复制。 (3认同)

pho*_*ogg 9

如果您只从一个大的 tar 文件中提取一个文件,那么您使用的是 GNU tar并且您可以保证 tar 文件从未被附加到其中,那么您可以通过使用--occurrence.

此选项告诉 tar 在找到您请求的每个文件的第一次出现时立即停止,例如

tar xf large-backup.tar --occurrence etc/passwd etc/shadow
Run Code Online (Sandbox Code Playgroud)

在找到每个passwd和 的一个副本后,将不会通过整个 tarball 进行后台处理shadow,而是会停止。如果这些文件出现在接近结尾处,性能增益不会太大,但如果它们出现在 500G 文件的一半,您将节省大量时间。

对于使用tar单次备份而不使用真正的磁带驱动器的人来说,这种情况可能是典型的情况。

请注意,您还可以通过--occurrence=NUMBER检索每个文件的第 NUMBER 次出现,这在您知道存档中多个版本时会有所帮助。默认情况下,行为等于NUMBER1。