Python 实现文件的全备份和差异备份详解


Posted in Python onDecember 27, 2016

Python实现文件的全备份和差异备份

之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:

  • md5sum获取有些软连接的MD5值存在问题
  • 不支持对空目录进行备份,因为md5sum无法获取空目录的md5值
  • 权限的修改md5sum无法判断

解决方案:

利用文件的mtime ctime

mtime(Modified time)是在写入文件时随文件内容的更改而更改的

ctime(Create time)是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改的

废话不多说直接上代码:

#!/usr/bin/env python
import time,os,sys,cPickle
fileInfo = {}
def logger(time,fileName,status,fileNum):
  f = open('backup.log','a')
  f.write("%s\t%s\t%s\t\t%s\n" % (time,fileName,status,fileNum))
def tar(sDir,dDir,fileNum):
  command = "tar zcf %s %s >/dev/null 2>&1" % (dDir + ".tar.gz",sDir)
  if os.system(command) == 0:
    logger(time.strftime('%F %X'),dDir + ".tar.gz",'success',fileNum)
  else:
    logger(time.strftime('%F %X'),dDir + ".tar.gz",'failed',fileNum)
def fullBak(path):
  fileNum = 0
  for root,dirs,files in os.walk(path):
    for name in files:
      file = os.path.join(root, name)
      mtime = os.path.getmtime(file)
      ctime = os.path.getctime(file)
      fileInfo[file] = (mtime,ctime)
      fileNum += 1
  f = open(P,'w')
  cPickle.dump(fileInfo,f)
  f.close()
  tar(S,D,fileNum)
def diffBak(path):
  for root,dirs,files in os.walk(path):
    for name in files:
      file = os.path.join(root,name)
      mtime = os.path.getmtime(file)
      ctime = os.path.getctime(file)
      fileInfo[file] = (mtime,ctime)
  if os.path.isfile(P) == 0:
    f = open(P,'w')
    f.close()
  if os.stat(P).st_size == 0:
    f = open(P,'w')
    cPickle.dump(fileInfo,f)
    fileNum = len(fileInfo.keys())
    f.close()
    print fileNum
    tar(S,D,fileNum)
  else:
    f = open(P)
    old_fileInfo = cPickle.load(f)
    f.close()
    difference = dict(set(fileInfo.items())^set(old_fileInfo.items()))
    fileNum = len(difference)
    print fileNum
    difference_file = ' '.join(difference.keys())
    print difference_file
    tar(difference_file,D,fileNum)
    f = open(P,'w')
    cPickle.dump(fileInfo,f)
    f.close()
def Usage():
  print '''
    Syntax: python file_bakcup.py pickle_file model source_dir filename_bk
      model: 1:Full backup 2:Differential backup
    example: python file_backup.py fileinfo.pk 2 /etc etc_$(date +%F)
      explain: Automatically add '.tar.gz' suffix
  '''
  sys.exit()
if len(sys.argv) != 5:
  Usage()
P = sys.argv[1]
M = int(sys.argv[2])
S = sys.argv[3]
D = sys.argv[4]
if M == 1:
  fullBak(S)
elif M == 2:
  diffBak(S)
else:
  print "\033[;31mDoes not support this mode\033[0m"
  Usage()

测试:

$ python file_backup.py data.pk 1 data data_$(date +%F) #全备份
$ > data/www.linuxeye.com #测试创建文件,修改文件权限
$ chmod 777 data/py/eshop_bk/data.db
$ python file_backup.py data.pk 2 data data_$(date +%F)_1 #备份改变的文件
2
data/py/eshop_bk/data.db data/www.linuxeye.com

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python动态加载变量示例分享
Feb 17 Python
python分割文件的常用方法
Nov 01 Python
Python实现队列的方法
May 26 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
python的dataframe和matrix的互换方法
Apr 11 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 Python
Python Queue模块详细介绍及实例
Dec 27 #Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 #Python
Python 递归函数详解及实例
Dec 27 #Python
python实现二维码扫码自动登录淘宝
Dec 27 #Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 #Python
Python中如何获取类属性的列表
Dec 26 #Python
Python中强大的命令行库click入门教程
Dec 26 #Python
You might like
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
php单一接口的实现方法
2015/06/20 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
jquery延迟对象解析
2016/10/26 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
详解python中init方法和随机数方法
2019/03/13 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
J2EE相关知识面试题
2013/08/26 面试题
高中美术教师事迹材料
2014/08/22 职场文书
2015中学教学工作总结
2015/07/22 职场文书
详解nodejs内置模块
2021/05/06 NodeJs