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中__init__和__new__的区别详解
Jul 09 Python
python计算一个序列的平均值的方法
Jul 11 Python
Python引用模块和查找模块路径
Mar 17 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
Python之时间和日期使用小结
Feb 14 Python
python文件选择对话框的操作方法
Jun 27 Python
Python实现中值滤波去噪方式
Dec 18 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
Python Django搭建文件下载服务器的实现
May 10 Python
python爬取某网站原图作为壁纸
Jun 02 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加密解密函数(动态加密)
2013/06/19 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
python 返回一个列表中第二大的数方法
2019/07/09 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
企业统计员岗位职责
2013/12/13 职场文书
组织鉴定材料
2014/06/02 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python