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 (1)
Oct 31 Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python实现从URL地址提取文件名的方法
May 15 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python实现石头剪刀布小游戏
Jan 20 Python
python远程邮件控制电脑升级版
May 23 Python
Python对列表的操作知识点详解
Aug 20 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 Python
Python 阶乘详解
Oct 05 Python
基于Python实现股票收益率分析
Apr 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运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
axios基本入门用法教程
2017/03/25 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
简单了解python PEP的一些知识
2019/07/13 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Python执行时间的几种计算方法
2020/07/31 Python
python cookie反爬处理的实现
2020/11/01 Python
python 实现的车牌识别项目
2021/01/25 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
优秀教师主要事迹
2014/02/01 职场文书
工作表现自我评价
2014/02/08 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
国际贸易专业求职信
2014/06/04 职场文书
师德师风学习材料
2014/12/19 职场文书
2015年纪委工作总结
2015/05/13 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB