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


Posted in Python onNovember 30, 2014

之前有写利用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/3water.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/3water.com

看了博主的代码,很受启发,但是有一个问题,如果我完成完整备份之后,删除了其中某个文件,再做差异备份,可以检测出被删除的文件,但是执行tar就会出错,因为这个文件已经是不存在的了,所以在执行tar之前,最好用os.path.exists()判断一下差异文件路径是否存在,如果不存在则不执行tar, 反馈一条文件删除信息。

Python 相关文章推荐
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python中map的基本用法示例
Sep 10 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
python自定义时钟类、定时任务类
Feb 22 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
python怎么提高计算速度
Jun 11 Python
python 装饰器的使用示例
Oct 10 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
关于Python错误重试方法总结
Jan 03 Python
python中time.ctime()实例用法
Feb 03 Python
Python 如何解决稀疏矩阵运算
May 26 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 Python
Python3 能振兴 Python的原因分析
Nov 28 #Python
Python3 正在毁灭 Python的原因分析
Nov 28 #Python
关于你不想知道的所有Python3 unicode特性
Nov 28 #Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 #Python
用Python编写一个国际象棋AI程序
Nov 28 #Python
Python中给List添加元素的4种方法分享
Nov 28 #Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 #Python
You might like
php常用hash加密函数
2014/11/22 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP递归的三种常用方式
2019/02/28 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Add a Formatted Table to a Word Document
2007/06/15 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
vue中activated的用法
2021/01/03 Vue.js
Python列表计数及插入实例
2014/12/17 Python
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Win8下python3.5.1安装教程
2020/07/29 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python 安装impala包步骤
2020/03/28 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
技术总监的工作职责
2013/11/13 职场文书
小学数学课后反思
2014/04/23 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
合同纠纷调解书
2015/05/20 职场文书
公司欠款证明
2015/06/24 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
详解Vue slot插槽
2021/11/20 Vue.js
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python