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益智游戏计算汉诺塔问题示例
Mar 05 Python
python连接数据库的方法
Oct 19 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
常用的Python代码调试工具总结
Jun 23 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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中的按位与和按位或操作示例
2014/01/27 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python执行get提交的方法
2015/04/29 Python
Python实现统计单词出现的个数
2015/05/28 Python
python Django模板的使用方法
2016/01/14 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
Python pymongo模块常用操作分析
2018/09/01 Python
浅谈Python的list中的选取范围
2018/11/12 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python字符串反转的四种方法详解
2019/12/02 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
家庭贫困证明
2014/09/23 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL