我有一个巨大的 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)只是.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
Run Code Online (Sandbox Code Playgroud)
在找到每个passwd和 的一个副本后,将不会通过整个 tarball 进行后台处理shadow,而是会停止。如果这些文件出现在接近结尾处,性能增益不会太大,但如果它们出现在 500G 文件的一半,您将节省大量时间。
对于使用tar单次备份而不使用真正的磁带驱动器的人来说,这种情况可能是典型的情况。
请注意,您还可以通过--occurrence=NUMBER检索每个文件的第 NUMBER 次出现,这在您知道存档中有多个版本时会有所帮助。默认情况下,行为等于NUMBER1。
| 归档时间: |
|
| 查看次数: |
13175 次 |
| 最近记录: |