为何tail后gzip与tail|gzip生成的压缩文件大小不同?
为什么
tail | gzip和先tail再gzip的压缩文件大小不一样? 这个问题的根源其实很简单——gzip在两种场景下是否写入了原始文件名的元数据,具体来拆解:
两种操作的核心差异
先存文件再压缩:
当你执行gzip -k output.tmp时,gzip是直接处理磁盘上的实体文件。它会自动把原始文件名(output.tmp)、文件修改时间这类元信息塞进压缩文件的头部。这些额外的元数据虽然不多,但确实会占用几个字节的空间。管道直接压缩:
而用tail --bytes=1000 ./input | gzip > ./output.gz时,gzip是从标准输入(管道)读取数据的,它没有对应的原始磁盘文件名可以记录,所以不会添加文件名这类额外元信息,只保留最基础的压缩数据结构。
怎么验证这个结论?
你可以用gzip -l命令查看两个压缩文件的元数据:
gzip -l output.tmp.gz gzip -l output.gz
执行后你会清楚看到:
output.tmp.gz的原始文件名列显示的是output.tmpoutput.gz的原始文件名列显示的是-,这是gzip用来标记“数据来自标准输入”的符号
字节差的具体由来
你看到的460字节 vs 449字节的差值,正好对应了output.tmp这个文件名的长度(10个字符)加上gzip用来标记文件名的控制字节。这些就是导致两个文件大小不同的全部原因。
如果想让管道方式生成的压缩文件和先存再压的大小一致,也可以手动指定文件名参数:
tail --bytes=1000 ./input | gzip --name=output.tmp > output.gz
这时候再用stat查看,两个压缩文件的大小就会完全一样了。
内容的提问来源于stack exchange,提问作者Miroslav Popov
相关产品推荐
相关产品推荐

