Python实现定期检查源目录与备份目录的差异并进行备份功能示例


Posted in Python onFebruary 27, 2019

本文实例讲述了Python实现定期检查源目录与备份目录的差异并进行备份功能。分享给大家供大家参考,具体如下:

在项目中,经常要更新文件,在更新之前首先要备份源文件,所以就用到了这个脚本(来自于Python自动化运维这本书),总共有以下几个步骤:

1. 获取要进行比较的两个目录,进行差异比较,把源目录特有的文件或目录、以及和备份目录不同的文件或目录保存到列表中,并且判断目录下面是否还有目录,递归进行保存这些差异文件。
2. 将差异文件列表中文件或目录的路径换成对应的备份路径,进行判断,如果备份路径不存在,就创建目录。
3. 继续对比源目录和新创建的备份目录中的差异文件,把源路径换成备份目录的路径。
4. 然后遍历复制源目录文件到备份目录。

以下是具体的实现代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import filecmp
import re
import shutil
holderlist = []
##对应第一个步骤
def compare_me(dir1, dir2):
  dircomp = filecmp.dircmp(dir1, dir2)
  only_in_one = dircomp.left_only
  diff_in_one = dircomp.diff_files
  dirpath = os.path.abspath(dir1)
  [ holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one ]
  [ holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one ]
  if len(dircomp.common_dirs) > 0:
    for item in dircomp.common_dirs:
      compare_me(os.path.abspath(os.path.join(dir1, item)), os.path.abspath(os.path.join(dir2, item)))
  return holderlist
##对应第二个步骤
def main():
  if len(sys.argv) > 2:
    dir1 = sys.argv[1]
    dir2 = sys.argv[2]
  else:
    print "Usage: ", sys.argv[0], "datadir backupdir"
    sys.exit()
  source_files = compare_me(dir1, dir2)
  dir1 = os.path.abspath(dir1)
  if not dir2.endswith('/'):
    dir2 = dir2 + '/'
  dir2 = os.path.abspath(dir2)
  destination_files = []
  createdir_bool = False
  for item in source_files:
    destination_dir = re.sub(dir1, dir2, item)
    destination_files.append(destination_dir)
    if os.path.isdir(item):
      if not os.path.exists(destination_dir):
        os.makedirs(destination_dir)
        createdir_bool = True
   ##对应第三个步骤
  if createdir_bool:
    destination_files = []
    source_files = []
    source_files = compare_me(dir1, dir2)
    for item in source_files:
      destination_dir = re.sub(dir1, dir2, item)
      destination_files.append(destination_dir)
  ##对应第四个步骤
  print "update item: "
  print source_files
  copy_pair = zip(source_files, destination_files)
  print "copy_pair is %s" % copy_pair
  for item in copy_pair:
    print "item is %s, %s" % (item[0], item[1])
    if os.path.isfile(item[0]):
      shutil.copyfile(item[0], item[1])
if __name__ == '__main__':
  main()

最后根据需要,可以设定一个定时检查,进行自动同步源目录和备份目录,让其保持一致性。

Python 相关文章推荐
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
Python中scatter函数参数及用法详解
Nov 08 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
python中的字典操作及字典函数
Jan 03 Python
python实现数据写入excel表格
Mar 25 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
TensorFLow 变量命名空间实例
Feb 11 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python实现对adb命令封装
Mar 06 Python
python网络编程之五子棋游戏
May 14 Python
python简单实现插入排序实例代码
Dec 16 Python
详解Django-restframework 之频率源码分析
Feb 27 #Python
Python的UTC时间转换讲解
Feb 26 #Python
Python逐行读取文件中内容的简单方法
Feb 26 #Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 #Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 #Python
初探利用Python进行图文识别(OCR)
Feb 26 #Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 #Python
You might like
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
用Python实现读写锁的示例代码
2018/11/05 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
关于建议书的格式范文
2014/05/20 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
mysql脏页是什么
2021/07/26 MySQL
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers