如何检查 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
运行良好。
我想知道的:
- 您只能处理一次流的假设是否正确?
- 如果中间不将数据保存到硬盘,还有什么方法可以前进?
使用 zless
而不是 zcat
。如果它的输入没有被压缩,它将原封不动地通过它(这允许你使用 zless
中的单个 运行 来混合压缩和未压缩的文件)。它通常是一个交互式实用程序,但如果输出不是终端,它只是一个过滤器。
echo "My plain text" | gzip | gzip | zless | zless
我有以下(简化的)情况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
运行良好。
我想知道的:
- 您只能处理一次流的假设是否正确?
- 如果中间不将数据保存到硬盘,还有什么方法可以前进?
使用 zless
而不是 zcat
。如果它的输入没有被压缩,它将原封不动地通过它(这允许你使用 zless
中的单个 运行 来混合压缩和未压缩的文件)。它通常是一个交互式实用程序,但如果输出不是终端,它只是一个过滤器。
echo "My plain text" | gzip | gzip | zless | zless