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中的内容,复制或替换到目标文件夹下,实现文件的替换等操作。可以极大的节约人为操作时间。