• 文件对比的脚本


    脚本要求:

    /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()
    

      

  • 相关阅读:
    【MySQL笔记】字符串、时间日期转换
    【MySQL笔记】触发器,存储过程和函数
    【MySQL笔记】用户管理
    spray 处理 response 的通用函数
    akka pubsub example
    一个手写的 http client
    scala get ipv4 address
    akka cluster singleton
    akka cluster sharding
    akka cluster 初体验
  • 原文地址:https://www.cnblogs.com/guantou1992/p/12618393.html
Copyright © 2020-2023  润新知