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函数嵌套实例
Sep 23 Python
Python-嵌套列表list的全面解析
Jun 08 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
详解django2中关于时间处理策略
Mar 06 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
Python实现弹球小游戏
Aug 01 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
python爬取天气数据的实例详解
Nov 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
解析php中die(),exit(),return的区别
2013/06/20 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
Augularjs-起步详解
2016/07/08 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
详解javascript void(0)
2020/07/13 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
python模块restful使用方法实例
2013/12/10 Python
python DataFrame 取差集实例
2019/01/30 Python
Python二元赋值实用技巧解析
2019/10/25 Python
python中的itertools的使用详解
2020/01/13 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
一些Solaris面试题
2015/12/22 面试题
婚礼司仪主持词
2014/03/14 职场文书
公司地址变更通知
2015/04/25 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
《刷子李》教学反思
2016/02/20 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang