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代码
Mar 13 Python
python服务器与android客户端socket通信实例
Nov 12 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
Python网络编程 Python套接字编程
Sep 13 Python
python线程池threadpool使用篇
Apr 27 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python中shapefile转换geojson的示例
Jan 03 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
django创建超级用户过程解析
Sep 18 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 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
简单谈谈favicon
2015/06/10 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
js实现全选和全不选
2020/07/28 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python的形参和实参使用方式
2019/12/24 Python
tensorflow的计算图总结
2020/01/12 Python
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
企业管理培训感言
2014/01/27 职场文书
致百米运动员广播稿
2014/01/29 职场文书
有关环保的标语
2014/06/13 职场文书
安全生产月标语
2014/10/07 职场文书
2014年电教工作总结
2014/12/19 职场文书
大一学生个人总结
2015/02/15 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers