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 pass 语句使用示例
Mar 11 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
Python 控制终端输出文字的实例
Jul 12 Python
python实现文件的分割与合并
Aug 29 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
django 模版关闭转义方式
May 14 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/02/10 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
js读取本地文件的实例
2017/12/22 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
Python读写Excel文件方法介绍
2014/11/22 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Python多进程原理与用法分析
2018/08/21 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
应届专科生个人的自我评价
2014/01/05 职场文书
学校岗位设置方案
2014/01/16 职场文书
门店业绩提升方案
2014/06/08 职场文书
北京申奥口号
2014/06/19 职场文书
反邪教标语
2014/06/23 职场文书
公务员检讨书
2014/11/01 职场文书
关于远足的感想
2015/08/10 职场文书
Python中else的三种使用场景
2021/06/16 Python
Python制作春联的示例代码
2022/01/22 Python
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL