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 相关文章推荐
Windows下安装python2和python3多版本教程
Mar 30 Python
Python数据结构之单链表详解
Sep 12 Python
Python实现PS图像调整黑白效果示例
Jan 25 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
python实现两张图片的像素融合
Feb 23 Python
Python实现FM算法解析
Jun 18 Python
如何通过python的fabric包完成代码上传部署
Jul 29 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
php事务处理实例详解
2014/07/11 PHP
php实现RSA加密类实例
2015/03/26 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
PHP实现倒计时功能
2020/11/16 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
python 实现A*算法的示例代码
2018/08/13 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
劳资专员岗位职责
2013/12/27 职场文书
文明礼仪主题班会
2015/08/13 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书