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 相关文章推荐
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
python 垃圾收集机制的实例详解
Aug 20 Python
解决python "No module named pip" 的问题
Oct 13 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 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
与数据库连接
2006/10/09 PHP
PHP学习笔记之二
2011/01/17 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
可输入的下拉框
2006/06/19 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
python将字母转化为数字实例方法
2019/10/04 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
2016寒假社会实践心得体会范文
2015/10/09 职场文书
高一数学教学反思
2016/02/18 职场文书
详解Redis复制原理
2021/06/04 Redis
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技