用Python写脚本,实现完全备份和增量备份的示例
时间:2019-04-14
本文章向大家介绍用Python写脚本,实现完全备份和增量备份的示例,主要包括用Python写脚本,实现完全备份和增量备份的示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
需求:
在/root/backup下面有两个文件夹dst和src。要求在周一的时候进行完全备份,其余日子进行增量备份。从src备份到dst。
思路及关键点:
建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值
完全备份的时候将文件名和md5值写在一个文件里面。cPickle的知识点。
增量备份的时候比较文件名是否在key里面,没有就要备份;有的话,这个文件的md5值是否改变,改变了就要备份
os.path.join()拼接路径,os.listdir(),os.chdir()
time.strftime()判断周几
cPickle,可以无损记录所有Python的变量类型。文件操作。
tarfile对文件打包的使用
hashlib用于计算文件md5的值。注意不要一次打开一个文件,4k地打开,防止打开一个超大文件爆内存。
with file()可以打开一个文件之后不f.close()
#!/usr/bin/env python import time import os import cPickle as p import tarfile import hashlib baseDir = '/root/backup' srcDir = 'src' dstDir = 'dst' fullName = "full_%s_%s.tar.gz" % (srcDir, time.strftime('%Y%m%d')) incrName = "incr_%s_%s.tar.gz" % (srcDir, time.strftime('%Y%m%d')) md5file = 'md5.data' def md5sum(fname): m = hashlib.md5() with file(fname) as f: while True: data = f.read(4096) if len(data) == 0: break m.update(data) return m.hexdigest() def fullBackup(): md5Dict = {} fileList = os.listdir(os.path.join(baseDir,srcDir)) for eachFile in fileList: md5Dict[eachFile] = md5sum(os.path.join(baseDir,srcDir,eachFile)) with file(os.path.join(baseDir,dstDir,md5file),'w') as f: p.dump(md5Dict,f) tar = tarfile.open(os.path.join(baseDir,dstDir,fullName),'w:gz') os.chdir(baseDir) tar.add(srcDir) tar.close() def incrBackup(): newmd5 = {} fileList = os.listdir(os.path.join(baseDir,srcDir)) for eachFile in fileList: newmd5[eachFile] = md5sum(os.path.join(baseDir,srcDir,eachFile)) with file(os.path.join(baseDir,dstDir,md5file)) as f: storedmd5 = p.load(f) tar = tarfile.open(os.path.join(baseDir,dstDir,incrName),'w:gz') os.chdir(baseDir) for eachKey in newmd5: if (eachKey not in storedmd5) or (newmd5[eachKey] != storedmd5[eachKey]): tar.add(os.path.join(srcDir,eachKey)) tar.close() with file(os.path.join(baseDir,dstDir,md5file),'w') as f: p.dump(newmd5,f) def main(): if time.strftime('%a') == 'Mon': fullBackup() else: incrBackup() if __name__ == '__main__': main() ~
以上这篇用Python写脚本,实现完全备份和增量备份的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
- Android View体系(十)自定义组合控件
- 算法(一)时间复杂度
- Android Studio详细安装流程和配置、主题
- html5 jqueryrotate插件实现旋转动画
- 为什么要使用String
- Android网络编程(十一)源码解析Retrofit
- android Material Design详解
- android EventBus详解(三)
- Android绘制优化(一)绘制性能分析
- android EventBus详解(二)
- [置顶] android EventBus详解(一)
- 开源组件photoView学习
- ViewPagerIndicator+viewpager指示器详解
- 实现去哪儿来回机票选择的view
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- QPainter的fillRect函数-QGradient-Preset渐变颜色预设值
- 深度学习|Tensorflow2.0进阶
- Mumble——简介及搭建
- 网站开启HSTS增强安全性
- 形式化分析工具(六):HLPSL Tutorial(Example 4,other)
- Typecho回复可见功能
- 微信小程序开发实战(13):图像组件(image)
- Typecho文章代码高亮功能
- “数据分析师”面试最怕被问到的SQL优化问题(下)
- 普通小程序的订阅消息不再限制时间
- Telnet 配置实验
- 网站加速那些事
- Python逻辑运算
- 获取小程序码并接受buffer流保存为图片的方法
- 在Python中使用OpenCV绘画和素描