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 sys.path详细介绍
Oct 17 Python
浅谈python字符串方法的简单使用
Jul 18 Python
python基于http下载视频或音频
Jun 20 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python实现名片管理系统
Feb 14 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
python基于win32api实现键盘输入
Dec 09 Python
Django开发RESTful API实现增删改查(入门级)
May 10 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输出九九乘法表代码实例
2015/03/27 PHP
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
jQuery冲突问题解决方法
2021/01/19 jQuery
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
Python global全局变量函数详解
2018/09/18 Python
python得到windows自启动列表的方法
2018/10/14 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
如何基于python生成list的所有的子集
2019/11/11 Python
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
播音主持专业个人自我评价
2014/01/09 职场文书
企业安全生产标语
2014/06/06 职场文书
校园广播稿100字
2014/10/06 职场文书
文言文辞职信
2015/02/28 职场文书
2015年少先队活动总结
2015/03/25 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书