Gzip压缩率计算结果异常问题求助
问题原因及解决方案
针对你遇到的脚本中gzip -l -r dist输出异常、单独执行结果不同甚至出现负数压缩率的问题,结合你使用的Apple gzip 353.100.22版本,核心原因主要有以下几点:
1. Apple gzip的-l -r组合存在逻辑bug
BSD系(包括Apple自带的)gzip在同时使用-l(查看压缩详情)和-r(递归遍历)时,存在.gz文件头部解析的缺陷。刚完成压缩就执行gzip -l -r dist,程序无法正确读取.gz文件里记录的原始文件大小,导致压缩率计算错误——这不是磁盘同步的问题,所以加sleep也没用,是gzip自身的递归列表逻辑有问题。
2. 二次压缩触发负数压缩率
如果你的vite build本身会生成一些.gz预压缩文件,那么gzip -9 -r dist会递归压缩所有文件,包括这些已有的.gz文件,生成.gz.gz后缀的文件。gzip对已压缩的数据二次压缩时,不仅不会变小,反而会因为额外的gzip头部开销变大,此时计算压缩率(公式:((原文件大小-压缩后大小)/原文件大小)*100)就会出现负数。
至于单独执行gzip -l -r dist结果不同,大概率是脚本执行时生成的.gz.gz文件在后续被你误清理,或者gzip递归压缩时的文件遍历顺序导致部分二次压缩文件未被正确统计,但核心还是版本bug的问题。
3. 元数据读取异常(可能性较低)
虽然你加了sleep但没用,还是提一句:Apple gzip在读取刚生成的.gz文件元数据时,可能因为内部缓存或系统文件属性缓存,导致获取的原始大小、压缩后大小不准确,进而计算出错误的压缩率。但延迟后问题依旧,这个原因可以排除。
验证与解决办法
- 检查二次压缩文件:执行
find dist -name "*.gz.gz",如果存在这类文件,修改脚本为gzip -9 -r dist --exclude="*.gz",避免压缩已有的.gz文件。 - 替换gzip版本:通过Homebrew安装GNU版gzip(
brew install gzip),GNU gzip的递归列表逻辑更稳定,不会出现这类异常。 - 绕开递归列表bug:不用
gzip -l -r,改用find dist -name "*.gz" -exec gzip -l {} \;,逐个处理.gz文件查看压缩信息。
内容的提问来源于stack exchange,提问作者Buttermelon
相关产品推荐
相关产品推荐

