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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python使用函数默认值实现函数静态变量的方法
Aug 18 Python
python与php实现分割文件代码
Mar 06 Python
Python中正则表达式的用法总结
Feb 22 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
深入了解python列表(LIST)
Jun 08 Python
python如何实现图片压缩
Sep 11 Python
python 数据类型强制转换的总结
Jan 25 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实现图片简单上传
2006/10/09 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
PHP二维数组去重算法
2016/12/17 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python类中super() 的使用解析
2019/12/19 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
土地转让协议书
2014/04/15 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL