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)
原文地址:https://www.cnblogs.com/Anec/p/10258322.html