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实现读取命令行参数的方法
May 22 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
Python实现带下标索引的遍历操作示例
May 30 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
Python中断多重循环的思路总结
Oct 04 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
Python实现钉钉订阅消息功能
Jan 14 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
yolov5返回坐标的方法实例
Mar 17 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分页显示制作详细讲解
2006/12/05 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
编写Python CGI脚本的教程
2015/06/29 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
python绘制封闭多边形教程
2020/02/18 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
党员干部承诺书
2014/03/25 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang