同一个文件夹两次zip压缩后的文件md5值不同
最近在做将一个文件夹压缩成zip包的工作,使用的是windows下的7zip软件。对这个文件夹使用7z命令压缩三次,第一次生成的zip文件和后面两次生成的zip文件的md5值不同,二三两次生成的文件是相同的。然后将第一次和第二次生成的zip文件进行解压,编写Python脚本对比解压后的两个文件夹,发现两个文件夹的对应文件的md5都是一样的。因此可以得出结论,三次生成的zip文件都是没问题的。
针对该情况,在Google上进行了搜索,找到一篇文章——同一文件的两次 zip 内容不一致,该文作者遇到的问题是在MacOS上,对同一个文件使用zip命令压缩两次,但两次生成zip文件的md5值不同。该作者对此进行了深入分析,阅读了ZIP标准文档和Apple上的zip命令源码,并做了实验,得出的结论是zip命令会将文件的access time写入到zip文件中,因此两次生成的zip文件的md5值会不同。具体内容,可以点击链接查看。
根据上文作者的介绍,本文作者在Ubuntu系统上做了实验,第一次使用zip命令后,文件夹的access time确实发生了变化,第二次使用zip命令后没有了变化。以下是执行结果,第一次执行stat demo
的Access为2021-04-21 00:55:57.432547254 +0800
,执行zip命令后变为了2021-04-21 00:56:19.136547389 +0800
,再执行zip命令后就不变了。使用md5sum命令计算两个文件的md5,两个zip文件是不同的。这验证了上文作者的结论。
ubuntu@VM-0-2-ubuntu:~/test1$ mkdir demo
ubuntu@VM-0-2-ubuntu:~/test1$ touch demo/a.txt
ubuntu@VM-0-2-ubuntu:~/test1$ stat demo
File: demo
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 131341 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 500/ ubuntu) Gid: ( 500/ ubuntu)
Access: 2021-04-21 00:55:57.432547254 +0800
Modify: 2021-04-21 00:56:05.556547304 +0800
Change: 2021-04-21 00:56:05.556547304 +0800
Birth: -
ubuntu@VM-0-2-ubuntu:~/test1$ zip -r a.zip demo/
adding: demo/ (stored 0%)
adding: demo/a.txt (stored 0%)
ubuntu@VM-0-2-ubuntu:~/test1$ stat demo/
File: demo/
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 131341 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 500/ ubuntu) Gid: ( 500/ ubuntu)
Access: 2021-04-21 00:56:19.136547389 +0800
Modify: 2021-04-21 00:56:05.556547304 +0800
Change: 2021-04-21 00:56:05.556547304 +0800
Birth: -
ubuntu@VM-0-2-ubuntu:~/test1$ zip -r b.zip demo
adding: demo/ (stored 0%)
adding: demo/a.txt (stored 0%)
ubuntu@VM-0-2-ubuntu:~/test1$ stat demo
File: demo
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 131341 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 500/ ubuntu) Gid: ( 500/ ubuntu)
Access: 2021-04-21 00:56:19.136547389 +0800
Modify: 2021-04-21 00:56:05.556547304 +0800
Change: 2021-04-21 00:56:05.556547304 +0800
Birth: -
ubuntu@VM-0-2-ubuntu:~/test1$ md5sum a.zip
87c8192695a41a3513d83c3fbb3c7a5b a.zip
ubuntu@VM-0-2-ubuntu:~/test1$ md5sum b.zip
9274b506eb6c32c87492fd54ca5450cf b.zip