Python实现校验源与备份目录差异

一 点睛

有时候我们无法确认备份目录与源目录文件是否保持一致,包括源目录中的新文件或目录、更新文件或目录有无成功同步,定期进行校 验,没有成功则希望有针对性地进行补备份。本案例使用了filecmp模块的left_only、diff_files方法递归获取源目录的更新项,再通过 shutil.copyfile、os.makedirs方法对更新项进行复制,最终保持一致状态。

二 代码

#!/usr/bin/env python
#coding:utf-8
import os, sys
import filecmp
import re
import shutil

holderlist = []


def compareme(dir1, dir2):                  #递归获取更新项函数
    dircomp = filecmp.dircmp(dir1, dir2)
    only_in_one = dircomp.left_only         #源目录新文件或目录
    diff_in_one = dircomp.diff_files        #不匹配文件,源目录文件已发生变化
    # 将更新文件名或目录追加到holderlist
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one]
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:        #判断是否存在相同子目录,以便递归
        for item in dircomp.common_dirs:    #递归子目录
            compareme(os.path.abspath(os.path.join(dir1, item)),os.path.abspath(os.path.join(dir2, item)))
        return holderlist


def main():
    if len(sys.argv) > 2:                   #要求输入源目录与备份目录
        dir1 = sys.argv[1]
        dir2 = sys.argv[2]
    else:
        print "Usage: ", sys.argv[0], "datadir backupdir"
        sys.exit()

    source_files = compareme(dir1, dir2)    #对比源目录与备份目录
    dir1 = os.path.abspath(dir1)            #定义源目录绝对路径

    if not dir2.endswith('/'):
        dir2 = dir2 + '/'                   #备份目录路径加“/”符
    dir2 = os.path.abspath(dir2)            #定义备份目录绝对路径
    destination_files = []
    createdir_bool = False

    for item in source_files:                #遍历返回的差异文件或目录清单
        # 将源目录差异路径清单对应替换成备份目录
        destination_dir = item.replace(dir1, dir2)
        destination_files.append(destination_dir)
        if os.path.isdir(item):                 #如果差异路径为目录且不存在,则在备份目录中创 建
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)
                createdir_bool = True            #再次调用compareme函数标记

    if createdir_bool:               #重新调用compareme函数,重新遍历新创建目录的内容
        destination_files = []
        source_files = compareme(dir1, dir2)            #调用compareme函数
        for item in source_files:                            #获取源目录差异路径清单,对应替换成备份目录
            destination_dir = item.replace(dir1, dir2)
            destination_files.append(destination_dir)

    print "update item:"
    # 将源目录与备份目录文件 清单拆分成元组
    print(source_files)
    print(destination_files)
    copy_pair = zip(source_files, destination_files)
    for item in copy_pair:
        if os.path.isfile(item[0]):     #判断是否为文件,是则进行复制
            shutil.copyfile(item[0], item[1])


if __name__ == '__main__':
    main()

三 结果

1 第一次运行

(venv) E:\Python\python_auto_maintain>python 2_2_2.py dir1 dir2
update item:
['E:\\Python\\python_auto_maintain\\dir1\\f5']
['E:\\Python\\python_auto_maintain\\dir2\\f5']

2 第二次运行

(venv) E:\Python\python_auto_maintain>python 2_2_2.py dir1 dir2
update item:
[]
[]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值