Python 实现文件的全备份和差异备份详解


Posted in Python onDecember 27, 2016

Python实现文件的全备份和差异备份

之前有写利用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/www.linuxeye.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/www.linuxeye.com

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python共享引用(多个变量引用)示例代码
Dec 04 Python
django 实现电子支付功能的示例代码
Jul 25 Python
详解python 注释、变量、类型
Aug 10 Python
Django中使用Celery的教程详解
Aug 24 Python
Python重新加载模块的实现方法
Oct 16 Python
django框架防止XSS注入的方法分析
Jun 21 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
django框架单表操作之增删改实例分析
Dec 16 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
如何通过python计算圆周率PI
Nov 11 Python
pandas取dataframe特定行列的实现方法
May 24 Python
Python Queue模块详细介绍及实例
Dec 27 #Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 #Python
Python 递归函数详解及实例
Dec 27 #Python
python实现二维码扫码自动登录淘宝
Dec 27 #Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 #Python
Python中如何获取类属性的列表
Dec 26 #Python
Python中强大的命令行库click入门教程
Dec 26 #Python
You might like
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
php统计数组元素个数的方法
2015/07/02 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
JS定时器实例
2013/04/17 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
使用python实现扫描端口示例
2014/03/29 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python数据化运营的重要意义
2019/11/25 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
房屋租赁协议书
2014/10/18 职场文书
综治工作汇报材料
2014/10/27 职场文书
邀请函范文
2015/02/02 职场文书
红色革命电影观后感
2015/06/18 职场文书
浅谈Python 中的复数问题
2021/05/19 Python