python作为非常强大的脚本语言,是运维以及开发常用的语言,但是若实现远程服务器大规模更新出现小问题,shutuil相关文件夹操作并不能有效的完成自己的操作。
所以采用循环遍历操作的方式,实现文件的拷贝,以及替换等操作,实现子文件夹拷贝等。
在这里插入代码片#!/usr/bin/python3
# -*- coding: utf-8 -*-
import shutil, os, collections,time,zipfile
def copyDir(sourcePath, targetPath):
if not os.path.isdir(sourcePath):
return '源目录不存在'
# 创建两个栈,一个用来存放原目录路径,另一个用来存放需要复制的目标目录
sourceStack = collections.deque()
sourceStack.append(sourcePath)
targetStack = collections.deque()
targetStack.append(targetPath)
# 创建一个循环当栈里面位空时结束循环
while True:
if len(sourceStack) == 0:
break
# 将路径从栈的上部取出
sourcePath = sourceStack.pop() # sourcePath = sourceStack.popleft()
# 遍历出该目录下的所有文件和目录
listName = os.listdir(sourcePath)
# 将目录路径取出来
targetPath = targetStack.pop() # targetPath = targetStack.popleft()
# 判断该目标目录是否存在,如果不存在就创建
if not os.path.isdir(targetPath):
os.makedirs(targetPath)
# 遍历目录下所有文件组成的列表,判断是文件,还是目录
for name in listName:
# 拼接新的路径
sourceAbs = os.path.join(sourcePath, name)
targetAbs = os.path.join(targetPath, name)
# 判断是否时目录
if os.path.isdir(sourceAbs):
# 判断目标路径是否存在,如果不存在就创建一个
if not os.path.exists(targetAbs):
os.makedirs(targetAbs)
# 将新的目录添加到栈的顶部
sourceStack.append(sourceAbs)
targetStack.append(targetAbs)
# 判断是否是文件
if os.path.isfile(sourceAbs):
shutil.copyfile(sourceAbs,targetAbs)
#远程push文件以zip形式,方式文件出现不可预期问题
def unzip_files(obj):
ss = os.listdir(obj)
for file in ss:
if file.endswith(".zip"):
zip_fileName = obj+file
zip_file = zipfile.ZipFile(zip_fileName)
zz = file.split(".zip")[0]
ff =obj + zz
if os.path.isdir(ff):
pass
else:
os.mkdir(ff)
for names in zip_file.namelist():
zip_file.extract(names,ff)
zip_file.close()
time.sleep(2)
os.remove(zip_fileName)
return zz
#实现更新功能,判断要更新文件夹下,若为文件夹则复制替换,若非文件夹则跳过
def update_dest_folder(object):
dd = []
if os.path.isdir(object):
updatefoldername = os.listdir(object)
for ff in updatefoldername:
updatefoldername = object+ "/" +ff
if os.path.isdir(updatefoldername):
dd.append(updatefoldername)
else:
pass
return dd
if __name__ == '__main__':
#要复制的文件夹地址
srcPath = "E:/update/"
ss = unzip_files(srcPath)
#要复制更新的目标文件地址
tPath = "E:/test"
names = update_dest_folder(tPath)
sorce_real = srcPath + "/"+str(ss)+"/"+str(ss)
print(sorce_real)
for destPath in names:
copyDir(sorce_real, destPath)
正常情况下,我们完成的时候,通过ansible或者其他工具,将需要更新替换的文件夹以zip包的形式上穿,然后远程调度命令,实现zip包的解压,删除,并且将zip中的内容,复制或替换到目标文件夹下,实现文件的替换等操作。可以极大的节约人为操作时间。