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实现爬虫从网络上下载文档的实例代码
Jun 13 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
详解pandas赋值失败问题解决
Nov 29 Python
pytorch交叉熵损失函数的weight参数的使用
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
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
JSON.stringify()方法讲解
2019/01/31 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
Python使用multiprocessing创建进程的方法
2015/06/04 Python
python3 shelve模块的详解
2017/07/08 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python如何调用字典的key
2020/05/25 Python
python 负数取模运算实例
2020/06/03 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
python中的yield from语法快速学习
2020/11/06 Python
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
成教自我鉴定
2013/10/27 职场文书
家长会邀请书
2014/01/25 职场文书
安全责任书范本
2014/04/15 职场文书
农业项目建议书
2014/08/25 职场文书
119消防日活动总结
2014/08/29 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
mysql创建存储过程及函数详解
2021/12/04 MySQL