zoukankan      html  css  js  c++  java
  • python

    差异备份以及文件同步:

    import os
    import filecmp
    import shutil
    import re
    
    # 差异增量更新,dir2 文件目录 与 dir1 文件目录更新,
    def a(dir1,dir2):
        cc = []
        d1 = os.path.abspath(dir1)
        d2 = os.path.abspath(dir2)
        a1 = filecmp.dircmp(d1,d2)
    
        cc += a1.diff_files + a1.left_only
        # print("差异列表:",cc)
    
        if cc:
            for i3 in cc:
                # print(os.path.join(d1,i3))
                if os.path.isfile(os.path.join(d1,i3)):
                    shutil.copy2(os.path.join(d1,i3),d2)
                else:
                    os.makedirs(os.path.join(d2,i3))
                    a(os.path.join(d1,i3),os.path.join(d2,i3))
        else:
            a2 = a1.left_list
            for i in a2:
                if os.path.isdir(os.path.join(d1,i)):
                    a(os.path.join(d1,i), os.path.join(d2,i))
    
    # dir2 文件目录与 dir1 文件目录同步,删除dir2 多余的文件以及目录
    def b(dir2,dir1):
        def cc(dir):
            t = []
            redir = "(%s)" % r'\'.join(dir.split("\"))
            for i in os.walk(dir):
                # print(i)
                if i[2] == []: continue
                if len(i[2]) > 1:
                    for i2 in i[2]:
                        t.append(os.path.join(re.sub(redir, '', i[0]), i2))
                else:
                    t.append(os.path.join(re.sub(redir, '', i[0]), i[2][0]))
            return t
    
        # 所有源文件的绝对路径
        t1 = cc(dir1)
    
        # 所有备份的文件的绝对路径
        t2 = cc(dir2)
    
        #  备份文件与源文件同步,找出备份文件中有的,而源文件没有的.
        t3 = list(set(t2).difference(set(t1)))
    
        # 移除多余的文件
        for i3 in t3:
            print(dir2,'---',i3)
            print('移除备份目录中多余的文件: %s'% ''.join(dir2+i3))
            pa =  ''.join(dir2+i3)
            os.remove(pa)
    
    # 递归去删除空的目录
    def c(dir2):
        for i in os.walk(dir2):
            if len(i[2]) != 0:continue
            try:
                os.rmdir(i[0])
            except OSError as e:
                for i2 in i[1]:
                    c(os.path.join(i[0],i2))
    
    # 主函数
    def main(dir1,dir2):
        a(dir1,dir2)
        b(dir2,dir1)
        c(dir2)
    
    if __name__ == '__main__':
        dir1 = input("请输入源目录绝对路径:")
        dir2 = input("请输入备份目录绝对路径:")
        main(dir1,dir2)
  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/Anec/p/10258322.html
Copyright © 2011-2022 走看看