【问题标题】:How to check if a STDIO stream is gzipped and consequently gunzip it in the same stream如何检查 STDIO 流是否被 gzip 压缩并因此将其压缩到同一流中
【发布时间】:2022-01-18 16:43:27
【问题描述】:

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

输入的数据流经过 gzip 压缩。然而,有时数据会意外地被双重 gzip 压缩,所以我必须做的是 ...incoming stream... | gunzip | gunzip | ...continue process... 。但只有当我确定第一个 gunzip 的输出是另一个 gzipped 数据流时。

我最初的想法是:

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. 如果不将数据保存到硬盘,有什么方法可以实现?

【问题讨论】:

  • 你的怀疑是正确的。

标签: linux bash stream pipe mime-types


【解决方案1】:

使用zless 代替zcat。如果它的输入没有被压缩,它将不变地通过它(这允许您使用zless 的单次运行以及压缩和未压缩文件的混合)。它通常是一个交互式实用程序,但如果输出不是终端,它只是一个过滤器。

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

【讨论】:

  • 这比我希望的要好得多,谢谢。
  • zcat 不够聪明,不能自己做这件事,这很烦人。
  • 这很奇怪,从手册页看:“Zless 不适用于通过标准输入传送到它的压缩数据;它要求将输入文件指定为参数。从管道读取压缩数据,您可以使用 ...|gunzip|less 代替 ...|zless。”
  • 我试过echo foo | gzip | zless,它成功了。
  • 我知道。猜测手册页需要更新...
猜你喜欢
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多