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求众数问题实例
Sep 26 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
python+flask实现API的方法
Nov 21 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python分布式编程实现过程解析
Nov 08 Python
python 导入数据及作图的实现
Dec 03 Python
python使用多线程+socket实现端口扫描
May 28 Python
Python定义一个Actor任务
Jul 29 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定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python读写文件方法总结
2015/06/09 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
简单了解django索引的相关知识
2019/07/17 Python
python实现各种插值法(数值分析)
2019/07/30 Python
学习Python列表的基础知识汇总
2020/03/10 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
python实现画图工具
2020/08/27 Python
中软Java笔试题
2012/11/11 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
安全生产先进个人材料
2014/02/06 职场文书
就业协议书的作用
2014/04/11 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
机器人瓦力观后感
2015/06/12 职场文书