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去除文件中空格、Tab及回车的方法
Apr 12 Python
Python对象转JSON字符串的方法
Apr 27 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python中的set实现不重复的排序原理
Jan 24 Python
Python读写文件基础知识点
Jun 10 Python
Python hmac模块使用实例解析
Dec 24 Python
Python自动化测试笔试面试题精选
Mar 12 Python
浅析python标准库中的glob
Mar 13 Python
python matplotlib库的基本使用
Sep 23 Python
python中remove函数的踩坑记录
Jan 04 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
python 获取计算机的网卡信息
Feb 18 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
推荐php模板技术[转]
2007/01/04 PHP
php数组总结篇(一)
2008/09/30 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
npm的lock机制解析
2019/06/20 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
layui 表单标签的校验方法
2019/09/04 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
将python代码和注释分离的方法
2018/04/21 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python银行系统实现源码
2019/10/25 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
python怎么提高计算速度
2020/06/11 Python
财务工作个人总结
2015/02/27 职场文书
党员进社区活动总结
2015/05/07 职场文书
远程教育学习心得体会
2016/01/23 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书