针对zip命令打包相同文件但MD5值不一样的问题。我们以分析问题->结局问题的思路来研究。
在Ubuntu上,使用zip命令打包相同内容的文件,但生成的压缩包的MD5值不同,这是由于以下原因导致的:
由于上述原因,即使压缩包中包含相同的文件内容,其生成的MD5值可能也会不同。如果需要比较文件内容是否相同,可以直接比较文件本身而不是压缩包的MD5值。
如果希望生成相同内容的压缩包具有相同的MD5值,可以采用如下方法:
可以考虑使用tar命令进行打包。tar命令在打包时不会包括文件的时间戳信息,因此生成的压缩包的MD5值在相同内容的情况下会保持一致。
这里依然可以使用zip命令,但要在使用前做一些处理。zip命令打包一样的文件,确保md5值 哈希码一致,解决方案如下:
@1 所有文件的时间戳必须具有可预测的值,将所有文件的时间戳设置为特定值,比如:
find . -exec touch -d '2023-01-01 01:01:01' {} \;
@2 所有文件的权限必须具有可预测的值,显式设置权限,例如 to 644,(说明:如果有权限相关的改动需要这样做,如果每次生成的文件都是一致的则不需要)如下所示:
find . -type f -exec chmod 644 {} \;
@3 文件添加到 zip 的顺序很重要。而不是依赖于递归和通配符,这取决于文件存储在依赖于文件系统且不可预测的目录中的顺序。使用诸如find和sort列表之类的东西来提供可预测的顺序。禁用zip“额外属性”功能。这可确保诸如存档修改时间戳、用户名等非确定性数据不会写入存档。使用该-X选项来执行此操作。具体如下:
find . -type f | sort | TZ=UTC zip -qX myfile.zip -@