如何在7-Zip命令行版本中仅禁用ARM64过滤器并兼容旧版本
我太懂你的痛点了——7-Zip 23.00新增的ARM64过滤器虽然能提升ARM64二进制文件的压缩率,但却给旧版本兼容性挖了个坑:旧版7-Zip会把ARM64过滤器识别成陌生的0A方法,看着就闹心。而且你试过的两个方案都不完美:-mf=off直接关掉所有过滤器,压缩率掉了不说,文件还变大了;-mf=BCJ2强制全局用BCJ2,虽然大小差不多,但速度反而慢了点,对于大量数据来说累积起来就很头疼。
精准解决:只禁用ARM64过滤器的正确姿势
其实7-Zip的命令行参数支持单独禁用某一个过滤器,你只需要在原有的压缩命令里加上这么一句:
-mf=-ARM64
这个参数的作用很明确:告诉7-Zip不要使用ARM64过滤器,但保留它原本的自动筛选逻辑——也就是对x86的exe/dll文件依然自动用BCJ或BCJ2过滤器,其他文件正常处理。这样一来,既回到了23.00版本之前的行为,完美兼容旧版7-Zip,又不会损失原本的压缩率和速度优势。
结合你原有命令的完整示例
把这个参数加到你一直在用的命令里,最终的完整命令是这样的:
7z a -t7z -mx=9 -myx=7 -mmt=on -mmtf=on -ms=on -mqs=on -mtm=off -mtc=off -mta=off -mtr=off -stl -mf=-ARM64 <你的输出压缩包路径> <要压缩的文件/目录>
效果对比验证
用这个命令压缩后,你会看到压缩方法变成了:
Method = LZMA2:26 LZMA:20 BCJ2 ARMT
和旧版7-Zip生成的压缩包方法完全一致,旧版本打开毫无问题;同时压缩速度和文件大小会和你原来不加额外参数的结果几乎持平——不会像-mf=off那样让文件涨到112MiB,也不会像-mf=BCJ2那样在速度上有不必要的损耗,完全符合你的需求。
小科普:-mf参数的灵活用法
其实7-Zip的-mf参数不止能开或关所有过滤器,它的用法很灵活:
mf=<过滤器名>:强制全局使用指定的过滤器mf=-<过滤器名>:禁用指定的单个过滤器- 还可以组合使用,比如
mf=-ARM64,-BCJ可以同时禁用ARM64和BCJ过滤器
我们这里只需要禁用ARM64,所以用-mf=-ARM64就足够了。
备注:内容来源于stack exchange,提问作者0xC0000022L

