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 相关文章推荐
Fiddler如何抓取手机APP数据包
Jan 22 Python
python 第三方库的安装及pip的使用详解
May 11 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python连接phoenix的方法示例
Sep 29 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
python3实现微型的web服务器
Sep 03 Python
Python数据分析模块pandas用法详解
Sep 04 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
django前端页面下拉选择框默认值设置方式
Aug 09 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 cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
python使用win32com库播放mp3文件的方法
2015/05/30 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
django加载本地html的方法
2018/05/27 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
Python绘制热力图示例
2019/09/27 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
学徒工职责
2014/03/06 职场文书
校企合作协议书
2014/04/16 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
银行业务授权委托书
2014/10/10 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers