文件对比的脚本
脚本要求:
/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\n")
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()

浙公网安备 33010602011771号