zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python 3 自动化运维实战小项目之校验源和备份目录之间的差异

Python备份项目自动化运维 实战 目录 之间
2023-09-14 09:16:00 时间

项目目标:

由于我们无法确认备份目录和源目录文件是否保存一致,包括源目录中的新文件、目录等 有无成功同步,所以写个程序来对比下,没有成功就补上去。

#!/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()