脚本要求:
/data/myapp/confs这个目录下有N个子目录,总共几千个由脚本生成的配置文件,其中可能有不知道在什么时候某些文件被人为的修改过。
现在用脚本生成一批新的配置文件在/data/myapp/confs.new目录下(内容不变)
现在写一个脚本完成以下功能:
1、找出/data/myapp/confs目录中被人为修改过的文件;
2、找出被修改的内容;
3、要求考虑目录层级(可能超级深)、文件大小(可能很大、很多)、考虑执行效率、最小化内存消耗;
#!/usr/bin/python # -*- coding: utf-8 -*- # 2020-3-16 # author:hhh import os,sys import filecmp import difflib diff_file_list = [] #定义空列表,用来储存不匹配文件路径 # 对比目录函数 def compare_dir(dir1, dir2): dirobj = filecmp.dircmp(dir1, dir2) #通过filecmp函数对比目录 only_in_dir1 = dirobj.left_only #出现的新的配置文件 diff_in_dir = dirobj.diff_files #不匹配文件,被人为修改的文件 [diff_file_list.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_dir1] [diff_file_list.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_dir] # 将两个目录对比的不匹配的文件或目录追加到diff_file_list if len(dirobj.common_dirs) > 0: # 判断是否存在相同子目录,以便递归 for item in dirobj.common_dirs: # 递归子目录 compare_dir(os.path.abspath(os.path.join(dir1, item)), os.path.abspath(os.path.join(dir2, item))) return diff_file_list #返回不匹配文件列表 # 读取文件函数 def file_reader(fname, block_size=1024): with open(fname) as f: while True: data = f.read(block_size) # 使用read每次读取1024个 if not data: break yield data # 文件对比函数 def diff_file(file1,file2): diff = difflib.HtmlDiff() # 创建htmldiff对象 file1_lines = file_reader(file1) file2_lines = file_reader(file2) # 读取file1,file2的文件 result = diff.make_file(file1_lines, file2_lines) # 通过make_file方法输出html 格式的对比结果 # 将结果写入到result_comparation.html文件中 try: with open('result_comparation.html', 'a+') as result_file: result_file.write(file1) # 写入file1文件名,便于区分 result_file.write(result) print("0==}==========> Successfully Finished ") except IOError as error: print('写入html文件错误:{0}'.format(error)) def main(): # 定义dir1和dir2的路径 dir1 = "/data/myapp/confs" dir2 = "/data/myapp/confs.new" # 执行对比目录函数 diff_files = compare_dir(dir1, dir2) print("被人工修改的文件有:",diff_files) # 执行对比文件函数 for file1 in diff_files: # file2 = file1.replace("confs","confs.new",1) file2 = file1.replace("dir1","dir2",1) # 修改字符串,匹配第一个confs diff_file(file1,file2) if __name__ == '__main__': main()