Python学习笔记-校验源与备份目录差异

校验源与备份目录差异

有时我们无法确认备份与源目录文件是否保持一致,包括源目录中的新文件或目录、更新文件或目录有无成功同步,定期进行校验,没有成功则希望有针对性地进行补备份。

本例使用了filecmp模块的left_only、diff_files方法递归获取源目录的更新项,再通过shutil.copyfile、os.makedirs方法对更新项进行复制,最终保持一致状态。

#!/usr/bin/python3
#
import os
import sys
import filecmp
import re
import shutil
holderlist=[]

def compareme(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:    #递归子目录
			compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item)))
	return holderlist
def checkargv():
	if len(sys.argv) < 2:   #要求输入源目录与备份目录
		print ("Usage: ", sys.argv[0], "datadir backupdir")
		sys.exit()
	else:
		dir1 = sys.argv[1]
		dir2 = sys.argv[2]
		source_files = compareme(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   #再次调用compareme函数标记

		if createdir_bool:      #重新调用compareme函数,重新遍历新创建目录的内容
			destination_files = []
			source_files = []
			source_files = compareme(dir1,dir2)     #调用compareme函数
			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)     #讲源目录与备份目录文件清单拆分成元组
		for item in copy_pair:
			if os.path.isfile(item[0]):     #判断是否为文件,是则进行复制操作
				shutil.copyfile(item[0], item[1])

if __name__ == ‘__main__‘:
	checkargv()

执行前:

[[email protected] pkg1]# tree -d test1 test2
test1
|-- test11
|-- test12
|-- test13
|-- test17
|-- test99
`-- testmmmm13
test2
|-- test11
|-- test12
|-- test13
|-- test14
`-- test17

11 directories

执行:

[[email protected] pkg1]# python3 checkdir2.py test1 test2
update item: 
[‘/opt/python361/pkg1/test1/test99‘, ‘/opt/python361/pkg1/test1/testmmmm13‘]

执行后:

[[email protected] pkg1]# tree -d test1 test2
test1
|-- test11
|-- test12
|-- test13
|-- test17
|-- test99
`-- testmmmm13
test2
|-- test11
|-- test12
|-- test13
|-- test14
|-- test17
|-- test99
`-- testmmmm13

13 directories
时间: 2024-11-13 16:38:58

Python学习笔记-校验源与备份目录差异的相关文章

python学习笔记八:文件与目录

一.文件的打开和创建 1.打开 open(file,mode): >>>fo = open('test.txt', 'r') >>>fo.read() 'hello\n' >>>fo.close() file(file,mode): >>>f = file('test.txt', 'r') >>>f.read() 'hello\n' >>>f.close() mode可取值: 2.创建 用w/w+/

[简明python教程]学习笔记之编写简单备份脚本

[[email protected] 0503]# cat backup_ver3.py #!/usr/bin/python #filename:backup_ver3.py import os import time #source source=['/root/a.sh','/root/b.sh','/root/c.sh'] #source='/root/c.sh' #backup dir target_dir='/tmp/' today=target_dir+time.strftime('

python学习笔记九——文件与目录

1.python进行文件读写的函数是open或file类 mode:r  只读 r+   读写 w  写入,先删除原文件,再重新写入,如果文件没有则创建 w+  读写,先删除原文件,再重新写入,如果文件没有则创建(可写入和输出) a  写入,在文件末尾追加新的内容,文件不存在则创建 a+  读写,在文件末尾追加新的内容,文件不存在则创建 b  打开二进制文件,可与r,w,a,+结合使用 U  支持所有的换行符号,"\r","\n","\r\n"

python学习笔记目录

人生苦短,我学python学习笔记目录:week1 python入门 week2 python基础week3 python进阶week4 python高阶week5 python数据结构与算法week6 网络编程week7 数据库技术之入门week8 数据库技术之MySQL和redis和mongodbweek9 前端技术之HTML和CSSweek10 前端技术之JavaScript和DOMweek11 前端框架之jQueryweek12 前端框架之bootstrapweek13 网络框架之入门w

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

python学习笔记12-模块使用

python学习笔记12-模块使用 模块os,sys 什么是模块? 模块os,sys 模块是Python组织代码的一种基本方式 一个Python脚本可以单独运行,也可以导入到另外一个脚本运行,用import hello语句来导入,不用加入.py 什么是Python的 包? Python的模块可以按照目录组织为包 创建一个包的步骤: 创建一个名字为包名的目录 在改目录下创建一个__init__.py文件 根据需要,在该目录下存放脚本文件或已编译的扩展及子包 import pack.m1,pack.

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

Python学习笔记--未经排版

Python 学习笔记 Python中如何做到Print() 不换行 答:Print("输出内容",end='不换行的分隔内容'),其中end=后面为2个单引号 注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号 Python中 is 和 == 的区别 答:Python中的对象包含三要素:id.type.value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd