如何检查 STDIO 流是否被压缩并随后将其压缩到同一流中

How to check if a STDIO stream is gzipped and consequently gunzip it in the same stream

我有以下(简化的)情况bash:

进入 gzip 压缩的数据流。然而,有时候,数据被意外压缩了两次,所以我要做的就是 ...incoming stream... | gunzip | gunzip | ...continue process... 。但只有当我确定第一个 gunzip 的输出是另一个 gzip 数据流时。

我最初的想法是:

echo "My plain text" | gzip | gzip | gunzip | if [ $(mimetype -b --stdin ) == 'application/gzip' ]; then zcat; else cat; fi

但这会导致第二个 gunzip (gzip: stdin: unexpected end of file) 的标准输入为空。我怀疑流只能读取一次并且 mimetype 已经完成它因此导致 zcat 的输入为空。

可以通过以下方式检查脚本的工作情况:

echo "My plain text" | gzip | gzip | gunzip | if [ 'application/gzip' == 'text/plain' ]; then cat; else zcat; fi

运行良好。

我想知道的:

  1. 您只能处理一次流的假设是否正确?
  2. 如果中间不将数据保存到硬盘,还有什么方法可以前进?

使用 zless 而不是 zcat。如果它的输入没有被压缩,它将原封不动地通过它(这允许你使用 zless 中的单个 运行 来混合压缩和未压缩的文件)。它通常是一个交互式实用程序,但如果输出不是终端,它只是一个过滤器。

echo "My plain text" | gzip | gzip | zless | zless