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 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
python 文件转成16进制数组的实例
Jul 09 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
对Python 内建函数和保留字详解
Oct 15 Python
利用Python实现kNN算法的代码
Aug 16 Python
python框架django项目部署相关知识详解
Nov 04 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
scrapy处理python爬虫调度详解
Nov 23 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 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中单双引号的区别详解
2016/06/12 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
js判断密码强度的方法
2020/03/18 Javascript
原生js生成图片验证码
2020/10/11 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
python计算auc指标实例
2017/07/13 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
总账会计岗位职责
2014/03/13 职场文书
一帮一活动总结
2014/05/08 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript