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解析xml成对应的html示例分享
Apr 02 Python
Python Queue模块详解
Nov 30 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
Python设计模式之中介模式简单示例
Jan 09 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
对python调用RPC接口的实例详解
Jan 03 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
python2和python3在处理字符串上的区别详解
May 29 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
python 安装impala包步骤
Mar 28 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
实战Python爬虫爬取酷我音乐
Apr 11 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 在线翻译函数代码
2009/05/07 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
php实现无限级分类
2014/12/24 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
Python编程中运用闭包时所需要注意的一些地方
2015/05/02 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
python3.x上post发送json数据
2018/03/04 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
css3中transition属性详解
2014/09/02 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
临床医师专业个人自我评价范文
2013/11/07 职场文书
怎么写有吸引力的自荐信
2013/11/17 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis