Python之——校验源目录与备份目录差异

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78970229

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

这里,我的脚本文件名称为backup.py

# -*- coding:UTF-8 -*-
'''
本实例使用了filecmp模块的left_only,diff_files方法地柜获取源目录的更新项,
再通过shutil.copyfile、os.makedirs方法对更新项进行复制,最终保持一致状态。
同时,本程序实现了只对修改的文件进行复制操作
Created on 2018年1月4日

@author: liuyazhuang
'''
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
    #定义源目录的绝对路径
    dirpath = os.path.abspath(dir1)
    #将更新文件名或目录追加到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 "请输入源目录和备份目录"
        sys.exit()
        
        #下面的代码是测试代码,测试完毕后注释掉
        #-------------测试目录开始------------------
        #dir1 = "D:/data/dir1"
        #dir2 = "D:/data/dir2"
        #-------------测试目录结束------------------
    
    #对比源目录和备份目录
    source_files = compareme(dir1, dir2)
    dir1 = os.path.abspath(dir1)
    #备份目录路径加'/'
    #if not dir2.endswith('/'): dir2 = dir2 + '/'
    destination_files = []
    createdir_bool = False
    
    #遍历返回的差异文件或者目录清单
    for item in source_files:
        #将源目录差异路径清单对应替换成备份目录
        #destination_dir = re.sub(dir1, dir2, item)
        destination_dir = item.replace(dir1, dir2)
        #print destination_dir
        destination_files.append(destination_dir)
        #如果差异路径为目录并且不存在,则在备份目录中创建
        if os.path.isdir(item):
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)
                #再次调用compareme函数标记
                createdir_bool = True
        
    #重新调用compareme函数,重新遍历新创建的目录内容    
    if createdir_bool:
        destination_files = []
        source_files = []
        #调用compareme函数
        source_files = compareme(dir1, dir2)
        #获取源目录差异路径清单,对用替换成备份目录
        for item in source_files:
            #destination_dir = re.sub(dir1, dir2, item)
            destination_dir = item.replace(dir1, dir2)
            destination_files.append(destination_dir)
    
    print "update item:"
    #输出更新项列表清单
    print source_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()
执行此脚本

python backup.py D:/data/dir1 D:/data/dir2
输出结果为:

update item:
['D:\\data\\dir1\\catering_sale_all.xls', 'D:\\data\\dir1\\catering_dish_profit.xls', 'D:\\data\\dir1\\catering_sale.xls', 'D:\\data\\dir1\\catering_sale.csv', 'D:\\data\\dir1\\catering_fish_congee.xls', 'D:\\data\\dir1\\test', 'D:\\data\\dir1\\catering_sale_all.xls', 'D:\\data\\dir1\\catering_dish_profit.xls', 'D:\\data\\dir1\\catering_sale.xls', 'D:\\data\\dir1\\catering_sale.csv', 'D:\\data\\dir1\\catering_fish_congee.xls', 'D:\\data\\dir1\\test\\catering_sale.csv', 'D:\\data\\dir1\\test\\catering_dish_profit.xls', 'D:\\data\\dir1\\test\\catering_fish_congee.xls', 'D:\\data\\dir1\\test\\catering_sale_all.xls', 'D:\\data\\dir1\\test\\catering_sale.xls']
拷贝完毕,我在D:/data/dir1目录下修改catering_dish_profit.xls文件,再次执行
python backup.py D:/data/dir1 D:/data/dir2
输出结果为:
update item:
['D:\\data\\dir1\\catering_dish_profit.xls']


Fastcopy功能特点 1.完全支持拖曳操作,支持拖曳多个文件到来源中; 2.支持外壳整合,方便利用右键菜单直接复制文件; 3.支持三种不同的HDD模式; 4.内建多种人性化的操作模式; 5.支持过滤,可以使用通配符; 6.支持任务管理; 7.支持命令行操作; 8.软件十分小巧,甚至可以在安装后,直接将安装目录中的文件复制到任何可移动存储设备中,方便携带,随取随用; 9.所有的复制操作都是通过“从介质(硬盘)读数→写入数→从缓存中读出→向介质(硬盘)写入数”这几项步骤来完成的,并且这些步骤都是多个线程同时进行的,如果线程之间的协同运作不够完美,那速度就会大打折扣,有些线程忙得要命,而有些却必须等待,FASTCOPY就是优化了它们之间的工作顺序,大大提高了速度。 10.易于使用,能够充分挖掘文件系统和硬盘的传输能力。 11.支持计数和计时,在很多专业的硬盘传输速度的评测中,FastCopy 成了不二之选! Fastcopy使用 1、指定源目录、目标目录 点击“源目录”、“目标目录”可以分别为其指定要复制的内容及目标文件夹。复制的内容可以是文件夹或文件。目标目录结尾键入“\”表示拷贝时要包括源目录本身及其内容;结尾不键入“\”表示只拷贝源目录下的内容。 用拖拽的方式同样可以指定源目录、目标目录。这样很方便,随着在资源管理器中浏览就可以将复制对象确定下来。另外,可以通过“设置”菜单中的“外壳扩展”为右键菜单建立“复制”与“删除”命令。 2、选择不同的操作方式 通过“目标目录”文本框下的下拉菜单按钮就可以挑选七种不同的操作方式。这里,复制项相对多些,都是在复制时经常会遇到的处理办法。 “移动”项是将“源目录”内容移动到“目标目录”中去,源目录内容消失;“全部删除”项是关闭“目标目录”,只对源目录内容进行处理。对于固定拷贝的操作可以建立一个任务,通过“任务菜单”菜单中的“添加/更新/删除”命令创建,方便一键就可复制或删除。 3、常规设置、硬盘模式定义 在“设置→常规设置”菜单中可以定义缓存的空间大小,它直接关系到复制时的速度快慢,现在机器配置都很强悍,这里设定值高些不成问题。相关的定义有I/O缓存设置、I/O设置、复制和删除、日志写入等项目。 硬盘模式的设置是为了在读写时对缓存的操作方式,默认下为自动硬盘模式,另外两种分别是相同硬盘模式、不同硬盘模式,可以根自己机器的配置来选择。相同硬盘模式是指用大的缓存进行读入,直到缓存满额,再转入大缓存写入;不同硬盘模式则是读写缓存多线程并行进行。 4、执行后的结果查询 在执行过程中会显示读取、写入、时间、传输效率、文件速率等信息,在下方的文本框中会显示当前拷贝的内容。拷贝完成后点击“显示列表”按钮可以查看拷贝内容及错误文件、目录信息。 软件对于拷贝和删除小文件或文件夹来讲,可能就有点大材小用了。对于大型的文件和文件夹就不同了,它能非常迅速的完成要拷贝的内容,通过简单的设置还能过滤不要的内容。体积小、方便携带、操作迅速。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值