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 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
详解python校验SQL脚本命名规则
Mar 22 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
通过Python实现一个简单的html页面
May 16 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 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
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP4 与 MySQL 交互使用
2006/10/09 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
php ci框架验证码实例分析
2013/06/26 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP 无限级分类
2017/05/04 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
Move.js入门
2017/02/08 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
最小二乘法及其python实现详解
2020/02/24 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
土木工程毕业生自荐信
2013/09/21 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
大学军训感言1000字
2014/02/25 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
公司股权转让协议书
2014/04/12 职场文书
跳槽求职信范文
2014/05/26 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书