关于bash:如何在Linux中从文件创建裸露的deflate流?

 2021-04-09 

How to create bare deflate stream from file in Linux?

因此,我所知道的所有工具都将通过deflate算法流进行压缩的文件以某种格式包含标头,文件名,其他校验和等。

是否可以使用一些标准Linux工具bash直接创建仅包含deflate压缩流的文件,如RFC-1951中所述?


我已经看到一些开发工具可以做到这一点,但是使用普通工具是不可能的(立即),因为原始的压缩流通常是无用的。

否则,在Linux上,gzip --no-name会生成压缩后的流,其标头的大小固定为10个字节。您可以使用dd对其进行修整。例如:

1
2
cat something | gzip --no-name | \\
  ( dd of=/dev/null bs=1 count=10; cat > gzip-without-header )

剩下的就是从输出文件中剥离最后8个字节(CRC,未压缩大小):

1
2
dd if=gzip-without-header of=gzip-without-anything \\
    bs=1 count=$[ `stat -c '%s' gzip-without-header` - 8 ]

P.S。 GZip文件格式在RFC1952中定义。


稍微好一点的解决方案(不写入临时文件)是:

1
cat something | gzip --no-name | tail --bytes=+11 | head --bytes=-8 > gzip-without-anything


gzip -nc filegzip < file将在标准输出上生成带有10字节标头和8字节尾部的deflate流。您可以使用dd删除标题和尾部,尽管您需要查看输出的大小以便为dd提供正确的值以切断结尾。