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学习之第三方包安装方法(两种方法)
Jul 30 Python
Python实现约瑟夫环问题的方法
May 03 Python
Python 调用Java实例详解
Jun 02 Python
用python处理图片实现图像中的像素访问
May 04 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Python  Django 母版和继承解析
Aug 09 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
Python中无限循环需要什么条件
May 27 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
Python标准库内置函数complex介绍
2014/11/25 Python
python创建关联数组(字典)的方法
2015/05/04 Python
分析Python中解析构建数据知识
2018/01/20 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
解决Python二维数组赋值问题
2019/11/28 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
Python如何给函数库增加日志功能
2020/08/04 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
Django视图类型总结
2021/02/17 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
高级文秘工作总结的自我评价
2013/09/28 职场文书
毕业自我评价范文
2013/11/17 职场文书
销售工作岗位职责
2013/12/24 职场文书
董事长秘书职责
2014/01/31 职场文书
服装设计专业自荐信
2014/06/17 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
新员工考核评语
2014/12/31 职场文书
庆七一晚会主持词
2015/06/30 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python