用Python写脚本,实现完全备份和增量备份的示例


Posted in Python onApril 29, 2018

需求:

在/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写脚本,实现完全备份和增量备份的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
详解Python使用tensorflow入门指南
Feb 09 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
Python shelve模块实现解析
Aug 28 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
python 8种必备的gui库
Aug 27 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
python实现手机推送 代码也就10行左右
Apr 12 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 Python
基于python的多进程共享变量正确打开方式
Apr 28 #Python
基于Python log 的正确打开方式
Apr 28 #Python
python+pandas分析nginx日志的实例
Apr 28 #Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 #Python
python实现关键词提取的示例讲解
Apr 28 #Python
python实现扫描日志关键字的示例
Apr 28 #Python
python socket网络编程之粘包问题详解
Apr 28 #Python
You might like
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
使用JavaScript破解web
2018/09/28 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Django的models模型的具体使用
2019/07/15 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
python能自学吗
2020/06/18 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
小学教师自我鉴定范文
2014/03/20 职场文书
设计大赛策划方案
2014/06/13 职场文书
锦旗标语大全
2014/06/23 职场文书
体育教师个人工作总结
2015/02/09 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript