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&MongoDB爬取图书馆借阅记录
Feb 05 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
python3转换code128条形码的方法
Apr 17 Python
Python函数和模块的使用总结
May 20 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python importlib动态导入模块实现代码
Apr 16 Python
Django中template for如何使用方法
Jan 31 Python
用python修改excel表某一列内容的操作方法
Jun 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
actionscript与javascript的区别
2011/05/25 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
详解Django中的权限和组以及消息
2015/07/23 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
python中实现k-means聚类算法详解
2017/11/11 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
基于python的Paxos算法实现
2019/07/03 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
工厂会计员职责
2014/02/06 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书