从标准输入中提取时让tar自动检测压缩类型


16

我使用GNU tar。压缩/解压缩文件时可以自动检测压缩类型。但是我需要从stdin解压缩档案,而compress类型是未知的。我注意到tar可以给我正确的建议,例如:

tar: Archive is compressed. Use -z option

但是我希望tar 自动使用该压缩选项,而不要求我输入该参数。我怎样才能做到这一点?为什么tar不解压缩,因为它已经知道压缩类型了?

谢谢!


开发起来并不难,但是直到现在还没有完成。
彼得-恢复莫妮卡

3
它无法执行此操作的原因是,直到读取tar数据stdin后才知道它所处理的数据类型,届时调用解压缩程序为时已晚。它支持gzip,bzip2等。解决此问题并不容易(它必须缓冲数据),因此它只是告诉您重试。
凯文·潘科

@KevinPanko为什么在哪里太晚了?不,不晚。他读取缓冲区中的第一个4K,测试其压缩类型(如果有),然后调用程序。此缓冲是10-20行的附加C代码。
彼得-恢复莫妮卡

2
在那一刻,当它知道它拥有什么数据时,就不能再使用简单的fork()/ exec()方法通过解压缩实用程序来传递数据了。该实用程序将从stdin管道中读取数据,并且现在缺少第一个4K。读取数据后,无法将数据放回管道中。
凯文·潘科

3
@KevinPanko:不过,可以通过分叉两个过程来完成,基本上等同于cat buffer - | gunzip。(或者,可以使用非阻塞I / O来避免进行额外的处理。)
Ilmari Karonen 2013年

Answers:


10

这不是您想听到的答案,但是GNU tar根据其手册不支持此答案:

在读取存档时必须指定解压缩选项的唯一情况是从不支持随机访问的管道或磁带机读取数据时。但是,在这种情况下,GNU tar将指示您应该使用哪个选项。例如:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

如果看到这样的诊断,只需将建议的选项添加到GNU tar的调用中:

$ cat archive.tar.gz | tar tzf -

- 8.1.1创建和读取压缩归档


2
注意,这在OSX上的tar命令中有效,但在使用GNU tar的Linux上则无效。因此可以解决此问题。
肖恩·佩里

8

最后,我意识到我不能让tar从stdin中检测和解压缩档案的原因是我使用了GNU tar。BSD tar可以自动完成此操作。因此,我决定现在在脚本中使用bsdtar而不是tar。

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.