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 11 Python
python分析nignx访问日志脚本分享
Feb 26 Python
Python实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
python实现朴素贝叶斯算法
Nov 19 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
python isinstance函数用法详解
Feb 13 Python
python os模块常用的29种方法使用详解
Jun 02 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Django windows使用Apache实现部署流程解析
Oct 12 Python
pandas 按日期范围筛选数据的实现
Feb 20 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
我的论坛源代码(九)
2006/10/09 PHP
PHP禁止页面缓存的代码
2011/10/23 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
Python设计模式之中介模式简单示例
2018/01/09 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
python之随机数函数的实现示例
2020/12/30 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
中专毕业个人的自荐信格式
2013/09/21 职场文书
优秀求职信范文分享
2013/12/19 职场文书
一名老师的自我评价
2014/02/07 职场文书
物业总经理岗位职责
2014/02/28 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
奖学金个人总结
2015/03/04 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Oracle 触发器trigger使用案例
2022/02/24 Oracle