博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现对文件的全量、增量备份
阅读量:5161 次
发布时间:2019-06-13

本文共 3960 字,大约阅读时间需要 13 分钟。

 
#!/user/bin/env python# @Time     :2018/6/6 10:10# @Author   :PGIDYSQ#@File      :FileBackup2.pyimport osimport filecmpimport shutilimport sysimport time,sched'''定时任务备份,增量备份'''schedule = sched.scheduler(time.time, time.sleep)def autoBackup(scrDir,dstDir):    if((not os.path.isdir(scrDir))or(not os.path.isdir(dstDir))or           (os.path.abspath(scrDir) != scrDir)or(os.path.abspath(dstDir) != dstDir)):        usage()    for item in os.listdir(scrDir):        scrItem = os.path.join(scrDir,item)        dstItem= scrItem.replace(scrDir,dstDir)        if os.path.isdir(scrItem):            #创建新增加的文件夹,保证目标文件夹结构与原始文件一致            if not os.path.exists(dstItem):                os.makedirs(dstItem)                print('make directory'+dstItem)            #递归调用自身函数            autoBackup(scrItem,dstItem)        elif os.path.isfile(scrItem):            #只复制新增或修改的文件            if((not os.path.exists(dstItem))or(not filecmp.cmp(scrItem,dstItem,shallow=False))):                shutil.copyfile(scrItem,dstItem)                print('file:'+scrItem+'==>'+dstItem,os.system('echo %time%'))    schedule.enter(10, 0, autoBackup, (scrDir, dstDir))def usage():    print('Error')    print('For example:{0}'.format(sys.argv[0]))    sys.exit(0)if __name__ == "__main__":    # if len(sys.argv) != 3:    #     usage()    # scrDir,dstDir = sys.argv[1],sys.argv[2]    scrDir, dstDir = r'E:\PyCharm\WorkSpace\TestPkg\base\src',r'E:\PyCharm\WorkSpace\TestPkg\base\dest'    #定时周期执行备份任务    schedule.enter(10, 0, autoBackup, (scrDir,dstDir))    schedule.run()  # 持续运行,直到计划时间队列变成空为止    #autoBackup(scrDir,dstDir)
 

 

#!/user/bin/env python# @Time     :2018/6/6 10:10# @Author   :PGIDYSQ#@File      :FileBackup.pyimport timeimport osimport tarfileimport shutilimport pickle as pimport hashlib'''实现每周一全量备份,其余时间增量备份'''def md5check(fname):    m = hashlib.md5()    with open(fname) as fobj:        while True:            data = fobj.read(4096)            if not data:                break            m.update(data.encode())#pay    return m.hexdigest()def full_backup(src_dir: object, dst_dir, md5file):    par_dir, base_dir = os.path.split(src_dir.rstrip('/'))    back_name = '%s_full_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))    full_name = os.path.join(dst_dir, back_name)    md5dict = {}    # tar = tarfile.open(full_name, 'w:gz')    # tar.add(src_dir)    # tar.close()    if os.path.exists(dst_dir):        shutil.rmtree(dst_dir)    shutil.copytree(src_dir,dst_dir)#拷贝文件    #shutil.make_archive(dst_dir,'zip',src_dir)#将文件压缩,注:如果压缩tar,中文文件名有可能乱码    for path, folders, files in os.walk(src_dir):        for fname in files:            full_path = os.path.join(path, fname)            md5dict[full_path] = md5check(full_path)    if os.path.exists(md5file):        with open(md5file, 'wb') as f0:            p.dump(md5dict, f0)    else:        with open(md5file,'xb') as f1:            p.dump(md5dict,f1)def incr_backup(src_dir, dst_dir, md5file):    par_dir, base_dir = os.path.split(src_dir.rstrip('/'))    back_name = '%s_incr_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))    full_name = os.path.join(dst_dir, back_name)    md5new = {}    for path, folders, files in os.walk(src_dir):        for fname in files:            full_path = os.path.join(path, fname)            md5new[full_path] = md5check(full_path)    with open(md5file,'rb') as fobj:        md5old = p.load(fobj)    with open(md5file, 'wb') as fobj:        p.dump(md5new, fobj)    #tar = tarfile.open(full_name, 'w:gz')    for key in md5new:        if md5old[key] != md5new[key]:            #tar.add(key)            shutil.copyfile(key,dst_dir)    #tar.close()if __name__ == '__main__':    src_dir = 'base/src'    dst_dir = 'base/dest/backupfile'    md5file = 'base/md5.data'    full_backup(src_dir, dst_dir, md5file)    # if time.strftime('%a') == 'Mon':    #     full_backup(src_dir, dst_dir, md5file)    # else:    #     incr_backup(src_dir, dst_dir, md5file)

 

转载于:https://www.cnblogs.com/ysq0908/p/9157380.html

你可能感兴趣的文章
Linux 用户账号与权限管理
查看>>
打包压缩
查看>>
Django中的logging
查看>>
Content_type组件
查看>>
Linux 安装mysql
查看>>
MySQL性能优化之一
查看>>
第12章 Linux系统管理-打包与压缩
查看>>
SVG 学学就会了。
查看>>
值类型和引用类型
查看>>
VS调试 断点不命中
查看>>
SQL SERVER 如何修改数据库文件路径
查看>>
抽象类和接口的比较
查看>>
关闭Windows 10 自动更新
查看>>
Swift泛型协议的N种用法
查看>>
数量加减
查看>>
swift中数据之间的转换
查看>>
【iOS】Swift4.0 GCD的使用笔记
查看>>
Swift - 将String类型的数字转换成数字类型(支持十进制、十六进制)
查看>>
学校简易管理系统(python面向对象无界面版)
查看>>
运动员喝饮料问题
查看>>