用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使用pil生成缩略图的方法
Mar 26 Python
python的unittest测试类代码实例
Dec 07 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Java及python正则表达式详解
Dec 27 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
Django CBV类的用法详解
Jul 26 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
python与mysql数据库交互的实现
Jan 06 Python
关于Python中进度条的六个实用技巧分享
Apr 05 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
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php 团购折扣计算公式
2011/11/24 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
php模板引擎技术简单实现
2016/03/15 PHP
简述php环境搭建与配置
2016/12/05 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
信号生成及DFT的python实现方式
2020/02/25 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
施工员岗位职责
2014/03/16 职场文书
庆祝儿童节标语
2014/10/09 职场文书
2016春节慰问信范文
2015/03/25 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python