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)
  • 相关阅读:
    查找字符串中特定字符最后出现的位置
    C# List中的ForEach
    tensorflow中一个矩阵和一个向量相加
    Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
    Hibernate-ORM:15.Hibernate中的Criteria查询
    Hibernate-ORM:14.Hibernate中的命名查询
    Hibernate-ORM:12.Hibernate中的多对多关联关系
    Hibernate-ORM:10.Hibernate中的分页
    Hibernate-ORM:09.Hibernate中的getCurrentSession()
    Hibernate-ORM:08.Hibernate中的投影查询
  • 原文地址:https://www.cnblogs.com/Anec/p/10258322.html
Copyright © 2011-2022 走看看