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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
python实现探测socket和web服务示例
Mar 28 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python实现网页自动签到功能
Jan 21 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
如何给phpadmin一个保护
2006/10/09 PHP
如何使用PHP中的字符串函数
2006/11/24 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
php-fpm配置详解
2014/02/12 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
js中日期的加减法
2015/05/06 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
python解析json实例方法
2013/11/19 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
顶岗实习计划书
2014/01/10 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
表演方阵解说词
2014/02/08 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
少先队活动总结
2014/08/29 职场文书
培训通知书模板
2015/04/17 职场文书
拖欠货款起诉状
2015/05/20 职场文书
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
python中 .npy文件的读写操作实例
2022/04/14 Python