工作中经常遇到版本迭代,需要对比两个工作目录文件是否有被改动,这时需要对比上个版本跟当前版本的文件、目录差异。在网上搜出来的工具,要么只能对比两个文件的内容差异,要么只能对比两个目录的差异。无法实现根目录下各层级子目录、同名文件MD5的差异。于是就自己写了个脚本,对比两个指定目录下,文件名是否一致、目录是否一致,子目录下的各层级文件、目录是否一致,两个同层级同名文件的MD5是否一致,然后将文件、目录差异打印到屏幕。这样就可以一目了然看到两个目录的差异了。
"""
describe: 该脚本用于比较两个目录下文件、目录的差异,相同层级的文件会对比MD5是否一致;
author:weib
date:20221029
"""
import hashlib
import os
from natsort import natsort
def get_file_md5(file_name):
"""
计算文件的md5
:param file_name:
:return:
"""
m = hashlib.md5() # 创建md5对象
with open(file_name, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data) # 更新md5对象
# print(m.hexdigest()) # 打印MD5
return m.hexdigest() # 返回md5对象
def diff_list(list1, list2, dir1, dir2):
all_list = set(list1 + list2)
if len(all_list)>0:
for i in all_list:
if i in list1 and i not in list2:
print(f"{dir1}目录中多出:{i}")
if i in list2 and i not in list1:
print(f"{dir2}目录中多出:{i}")
if i in list1 and i in list2:
if os.path.isdir((dir1 + "\\" + i)) and os.path.isdir((dir2 + "\\" + i)) :
dir11 = dir1 + "\\" + i
dir22 = dir2 + "\\" + i
do(dir11,dir22)
if os.path.isfile((dir1 + "\\" + i)) and os.path.isfile((dir2 + "\\" + i)):
file11 = dir1 + "\\" + i
file22 = dir2 + "\\" + i
# print("开始比较两个文件的MD5")
if get_file_md5(file11) == get_file_md5(file22):
pass
# print("两个文件的MD5一致")
else:
print(f"****请检查 {file11} 文件和 {file22} 文件,两个文件的MD5不一致****")
def do(dir1, dir2):
flist1 = os.listdir(dir1)
flist2 = os.listdir(dir2)
# 文件目录重新自然排序,同Windows
new_filelist1 = natsort.natsorted(flist1)
new_filelist2 = natsort.natsorted(flist2)
diff_list(new_filelist1, new_filelist2, dir1, dir2)
# 使用时请修改如下两个对比的目录。
dir1 = "E:\\D01\\"
dir2 = "E:\\D02\\"
if __name__ == '__main__':
# 仅打印输出有差异的文件、目录,若执行完成无内容输出,则表示两个目录无差异。
do(dir1,dir2)
目录缺失、文件名不一致:
同层级、同名文件内容不一致:
运行结果: