用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计算牛顿迭代多项式实例分析
May 07 Python
详细讲解Python中的文件I/O操作
May 24 Python
在Python的Django框架中使用通用视图的方法
Jul 21 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
在Tensorflow中查看权重的实现
Jan 24 Python
pandas数值排序的实现实例
Jul 25 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异步调用socket实现代码
2012/01/12 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php四种基础算法代码实例
2013/10/29 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
表单内同名元素的控制
2006/11/22 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
基于vue实现探探滑动组件功能
2020/05/29 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
python语言中with as的用法使用详解
2018/02/23 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Python实现最常见加密方式详解
2019/07/13 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
奥地利网上书店:Weltbild
2017/07/14 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
物流专业大学应届生求职信
2013/11/03 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
JavaScript的Set数据结构详解
2022/02/18 Javascript
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
Java 写一个简单的图书管理系统
2022/04/26 Java/Android