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之再深点,更懂list
Sep 20 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
实现python版本的按任意键继续/退出
Sep 26 Python
python xml解析实例详解
Nov 14 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
Django 缓存配置Redis使用详解
Jul 23 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
python常用运维脚本实例小结
Feb 14 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
Jquery性能优化详解
2014/05/15 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
python函数的作用域及关键字详解
2019/08/20 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
日本航空官方网站:JAL
2019/06/19 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
机房搬迁方案
2014/05/01 职场文书
售房协议书范本2014
2014/10/23 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
javascript对象3个属性特征
2021/11/17 Javascript
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis