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 相关文章推荐
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
Python中整数的缓存机制讲解
Feb 16 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
python django下载大的csv文件实现方法分析
Jul 19 Python
pytorch 输出中间层特征的实例
Aug 17 Python
python实现WebSocket服务端过程解析
Oct 18 Python
Django异步任务线程池实现原理
Dec 17 Python
python实现录屏功能(亲测好用)
Mar 02 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
Python Selenium自动化获取页面信息的方法
Aug 31 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
Codeigniter注册登录代码示例
2014/06/12 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python如何存储数据到json文件
2020/03/09 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
超市5.1促销活动
2014/01/15 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
师范生求职信
2014/06/14 职场文书