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网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python实现的特征提取操作示例
Dec 03 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
Python3远程监控程序的实现方法
Jul 15 Python
django 控制页面跳转的例子
Aug 06 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
python实现126邮箱发送邮件
May 20 Python
Python if else条件语句形式详解
Mar 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
PHP编码转换
2012/11/05 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Vuex的热更替如何实现
2020/06/05 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
python实现在windows服务中新建进程的方法
2015/06/30 Python
python的else子句使用指南
2016/02/27 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
招商经理岗位职责
2013/11/16 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
Flask搭建一个API服务器的步骤
2021/05/28 Python