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 相关文章推荐
Python2.x中文乱码问题解决方法
Jun 02 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
python快排算法详解
Mar 04 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
Python简单实现区域生长方式
Jan 16 Python
Python PIL库图片灰化处理
Apr 07 Python
Python使用Matlab命令过程解析
Jun 04 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
python开发飞机大战游戏
Jul 15 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
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
php文件上传类完整实例
2016/05/14 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
解决Django中多条件查询的问题
2019/07/18 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
委托书范本格式
2019/04/18 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技