文件与目录差异对比方法 模块filecmp可以实现文件、目录、遍历子目录的差异对比功能 单文件对比 filecmpNaNp(f1,f2[,shallow]) import filecmp filecmpNaNp('nginx.conf.v1','nginx.conf.v2') False 多文件对比 filecmpNaNpfiles(dir1,dir2,common[,shallow]) filecmpNaNpfiles('1','2',['1','2','3','4','5']) (['1', '2', '3'], [], ['4', '5']) 目录对比 dircmp(a,b[,ignore[,hide]]) #!/usr/bin/env python import filecmp a = '/root/1' b = '/root/2' dirobj = filecmp.dircmp(a,b,['test.py']) dirobj.report() dirobj.report_partial_closure() dirobj.report_full_closure() print "left_list:" + str(dirobj.left_list) print "right_list:" + str(dirobj.right_list) print "common:" + str(dirobj.common) print "left_only:" + str(dirobj.left_list) print "right_ony:" + str(dirobj.right_list) print "common_dirs:" + str(dirobj.common_dirs) print "common_files:" + str(dirobj.common_files) print "common_funny:" + str(dirobj.common_funny) print "same_file:" + str(dirobj.same.files) print "diff_files:" + str(dirobj.diff_files) print "funny_files:" + str(dirobj.funny_files) 校验源与备份目录差异 #!/usr/bin/env python import os,sys import filecmp import re import shutil holderlist = [] def compareme(dir1,dir2): dircomp = filecmp.dircmp(dir1,dir2) only_in_one = dircomp.left_only diff_in_one = dircomp.diff_files dirpath = os.path.abspath(dir1) [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in only_in_one] [holderlist.append(os.path.abspath(os.path.join(dir1,x)))for x in diff_in_one] if len(dircomp.common_dirs) > 0: for item in dircomp.common_dirs: compareme(os.path.abspath(os.path.join(dir1,item)),\ os.path.abspath(os.path.join(dir2,item))) return holderlist def main(): if len(sys.argv) > 2: dir1 = sys.argv[1] dir2 = sys.argv[2] else: print "Usage:",sys.argv[0],"datadir backupdir" sys.exit() source_files = compareme(dir1,dir2) dir1 = os.path.abspath(dir1) if not dir2.endswith('/'):dir2 = dir2 + '/' dir2 = os.path.abspath(dir2) destination_files = [] createdir_bool = False for item in source_files: destination_dir = re.sub(dir1,dir2,item) destination_files.append(destination_dir) if os.path.isdir(item): if not os.path.exists(destination_dir): os.makedirs(destination_dir) createdir_bool = True if createdir_bool: destination_files = [] source_files = [] source_files = compareme(dir1,dir2) for item in source_files: destination_dir = re.sub(dir1,dir2,item) destination_files.append(destinstion_dir) print "ipdate item:" print source_files copy_pair = zip(source_files,destination_files) for item in copy_pair: if os.path.isfile(item[0]): shutil.copyfile(item[0],item[1]) if __name__ == '__main__': main()
|