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的web.py框架下的application.py模块
May 02 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
python Django框架实现自定义表单提交
Mar 25 Python
python中的lambda表达式用法详解
Jun 22 Python
python 识别图片中的文字信息方法
May 10 Python
python区块及区块链的开发详解
Jul 03 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
python爬虫可以爬什么
Jun 16 Python
基于Python爬取素材网站音频文件
Oct 21 Python
Python作用域和名称空间的详细介绍
Apr 13 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
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
nohup的用法
2012/11/26 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
《画风》教学反思
2014/04/16 职场文书
技校毕业生自荐书
2014/05/23 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
护士求职简历自我评价
2015/03/10 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
Python 全局空间和局部空间
2022/04/06 Python