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实现批量下载文件
May 17 Python
Python实现批量修改文件名实例
Jul 08 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
python实现扫雷游戏的示例
Oct 20 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 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
smarty表格换行实例
2014/12/15 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
webpack之devtool详解
2018/02/10 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
python实现批量修改文件名代码
2017/09/10 Python
python实现zabbix发送短信脚本
2018/09/17 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
用python制作个视频下载器
2021/02/01 Python
接口可以包含哪些成员
2012/09/30 面试题
运动会广播稿30字
2014/01/21 职场文书
工地安全检查制度
2014/02/04 职场文书
银行求职信范文
2014/05/26 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
绿色校园广播稿
2014/10/13 职场文书
工程技术员岗位职责
2015/04/11 职场文书
python开发飞机大战游戏
2021/07/15 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python