我使用GNU tar。压缩/解压缩文件时可以自动检测压缩类型。但是我需要从stdin解压缩档案,而compress类型是未知的。我注意到tar可以给我正确的建议,例如:
tar: Archive is compressed. Use -z option
但是我希望tar 自动使用该压缩选项,而不要求我输入该参数。我怎样才能做到这一点?为什么tar不解压缩,因为它已经知道压缩类型了?
谢谢!
开发起来并不难,但是直到现在还没有完成。
—
彼得-恢复莫妮卡
它无法执行此操作的原因是,直到读取
—
凯文·潘科
tar
数据stdin
后才知道它所处理的数据类型,届时调用解压缩程序为时已晚。它支持gzip,bzip2等。解决此问题并不容易(它必须缓冲数据),因此它只是告诉您重试。
@KevinPanko为什么在哪里太晚了?不,不晚。他读取缓冲区中的第一个4K,测试其压缩类型(如果有),然后调用程序。此缓冲是10-20行的附加C代码。
—
彼得-恢复莫妮卡
在那一刻,当它知道它拥有什么数据时,就不能再使用简单的
—
凯文·潘科
fork()
/ exec()
方法通过解压缩实用程序来传递数据了。该实用程序将从stdin
管道中读取数据,并且现在缺少第一个4K。读取数据后,无法将数据放回管道中。
@KevinPanko:不过,可以通过分叉两个过程来完成,基本上等同于
—
Ilmari Karonen 2013年
cat buffer - | gunzip
。(或者,可以使用非阻塞I / O来避免进行额外的处理。)