python脚本:
# -*-coding:utf-8-*-
#===============================================================================
# 目录对比工具(包含子目录 ),并列出
# 1、A比B多了哪些文件
# 2、B比A多了哪些文件
# 3、二者相同的文件: md5比较
#===============================================================================
import os
import time
import difflib
import hashlib
import shutil
def getFileMd5(filename):
if not os.path.isfile(filename):
print('file not exist: ' + filename)
return
myhash = hashlib.md5()
f = open(filename,'rb')
while True:
b = f.read(8096)
if not b :
break
myhash.update(b)
f.close()
return myhash.hexdigest()
def getAllFiles(path):
flist=[]
for root, dirs , fs in os.walk(path):
for f in fs:
f_fullpath = os.path.join(root, f)
f_relativepath = f_fullpath[len(path):]
flist.append(f_relativepath)
return flist
def dirCompare(comparePath,targetPath):
afiles = getAllFiles(comparePath)
bfiles = getAllFiles(targetPath)
setA = set(afiles)
setB = set(bfiles)
commonfiles = setA & setB # 处理共有文件
for of in sorted(commonfiles):
amd=getFileMd5(comparePath+'\\'+of)
bmd=getFileMd5(comparePath+'\\'+of)
if amd != bmd:
if not os.path.exists(os.path.dirname(os.getcwd() + of)):
os.makedirs(os.path.dirname(os.getcwd() + of))
# 将文件保存在执行此脚本的目录...
shutil.copyfile(targetPath + of, os.getcwd() + of)
# 处理仅出现在一个目录中的文件
onlyFiles = setA ^ setB
onlyInA = []
onlyInB = []
for of in onlyFiles:
if of in afiles:
onlyInA.append(of)
elif of in bfiles:
onlyInB.append(of)
if len(onlyInA) > 0:
print ('-' * 20,"only in ", comparePath, '-' * 20)
for of in sorted(onlyInA):
print (of)
# 不保存comparePath多出来的文件...
if len(onlyInB) > 0:
print ('-' * 20,"only in ", targetPath, '-' * 20)
for of in sorted(onlyInB):
print (of)
if not os.path.exists(os.path.dirname(os.getcwd() + of)):
os.makedirs(os.path.dirname(os.getcwd() + of))
# 将文件保存在执行此脚本的目录...
shutil.copyfile(targetPath + of, os.getcwd() + of)
if __name__ == '__main__':
comparePath = 'D:\\test1\\assets' #对比文件夹
targetPath = 'D:\\test2\\assets' #参考文件夹
savePath = 'D:\\test3\\assets' #保存文件夹,在这里我没保存到savePath,大家如果需要保存,可以把脚本中的os.getcwd()替换为savePath
dirCompare(comparePath, targetPath)
print("\ndone!")
参考文章:https://blog.csdn.net/linxinfa/article/details/90240952