首页 > 编程语言 >如何用python的pysmb模块,下载smb服务器上的以deb结尾文件?

如何用python的pysmb模块,下载smb服务器上的以deb结尾文件?

时间:2023-05-26 12:55:04浏览次数:65  
标签:匹配 python res list file pysmb path deb conn

需求:

  • 如何用python的pysmb模块,下载smb服务器上的以deb结尾文件?
    • 服务器在192.168.9.5
  • 扩展需求:有时候,也会下载以xxx开头的文件。

实现方式:

    • #  !/usr/bin/env python
      #  -*- coding: utf-8 -*-
      # 安装依赖模块:pip install pysmb
      
      from smb.SMBConnection import SMBConnection
      import re, os
      
      host = "192.168.9.5"  # 192.168.9.5服务器ip
      username = "[email protected]"  # 用户名,改成你自己的
      password = "liqi123456"  # 密码,
      conn_name = "liqi"  # 这个随便,可以为空字符串
      remote_name = "FS-SH"  # 这个是上海192.168.9.5共享主机的主机名,listShares会用到,保持不变即可
      
      # ver_dir只能有一级,否则报错,所有路径拼接到ver_dir
      ver_dir = '发布路径'
      
      # connect to the server
      conn = SMBConnection(username, password, conn_name, remote_name, is_direct_tcp=True)  # is_direct_tcp 保持长连接
      
      conn.connect(host, 445)  # smb协议默认端口445
      
      
      def get_latest_file(conn, share_name, folder, extension, flag=False):
          """
          conn:连接对象
          share_name:  例如:'软件发布'
          folder: 例如: "/03 软件版本/"
          extension :  要搜索的名字 .deb 默认是以xxx结尾匹配
          flag : 默认是关闭。开启后会以开头进行匹配
          """
          file_list = conn.listPath(share_name, folder)  # 列出所有deb文件
          # print(file_list)
      
          # *=============================匹配方式===================================*
          if not flag:  # 默认以结尾匹配
              matching_files = [f for f in file_list if f.filename.endswith(extension)]  # 查找文件名是否以".deb"结尾
          else:
              matching_files = [f for f in file_list if f.filename.startswith(extension)]  # 匹配以xxx开头
          # *=======================================================================*
          # print(matching_files)
      
          # *==========如果没有找到文件,递归查找=========*
          if matching_files:
              # 根据正则来匹配版本,我们的版本v1.1.0这种
              versions = [re.search(r'\d+\.\d+\.\d+', f.filename).group() for f in matching_files]
              latest_version = max(versions)  # 以结尾匹配,会匹配到多个版本,取最大的
              latest_file = [f.filename for f in matching_files if latest_version in f.filename]
              # print(latest_file)
      
              # *=============================以结尾匹配会匹配多个===================================*
              if not flag:  # 默认以结尾匹配
                  if len(latest_file) > 1:  # 过滤掉单个的,这里不过滤也行,看需求把。我们这里会匹配多个,我这里是过滤了一下
                      for file in latest_file:
                          res = os.path.join(folder, file)  # 拼接路径
                          print("查找到版本有:", res)
                          res_list.append(res)
              # *=============================以开头匹配会匹配1个===================================*
              else:
                  for file in latest_file:
                      res = os.path.join(folder, file)  # 拼接路径
                      print("查找到版本有:", res)
                      res_list.append(res)
      
          # *==========如果没有找到文件,递归查找=========*
          else:
              # 如果没有
              folders = [f.filename for f in file_list if f.isDirectory]
              new_list = []
              for i in folders:
                  res = re.findall(r"\.{1,2}$", i)  # 剔除掉.和..
                  if not res:
                      new_list.append(i)  
              for sub_folder in new_list:
                  sub_folder_path = os.path.join(folder, sub_folder)
                  result = get_latest_file(conn, share_name, sub_folder_path, extension, flag)  # 递归调用
                  if result:
                      return result
              return None
      
      
      def down_files(conn, res_list):
          for file_path in res_list:
              # 下载最新的文件
              local_folder = '.'  # 在当前文件下载,也可以自己创建,但要保证目录有
              local_file_path = os.path.join(local_folder, os.path.basename(file_path))  # 本地要存的文件位置
              # print(local_file_path)
              with open(local_file_path, 'wb') as f:
                  print(">>>正在下载:", local_file_path)
                  conn.retrieveFile(ver_dir, file_path, f)
              print(">>>已下载:", file_path)
          else:
              print("没有找到指定扩展名的文件")
      
      
      if __name__ == '__main__':
          res_list = []  # 存储所有搜索到的文件路径
      
          # =====0.配置路径======
          ver_dir = "软件发布"
          path = "/03 用户软件版本/"  # 从哪个目录下开始递归查找
      
          # ver_dir = '部门共享'
          # path = r"/测试部/软件发布/主线版本/202305/"  #
      
          # =====1.要匹配的参数======
          extension = ".deb"  # 匹配 以.deb为后缀的
          # extension = "SDK" # 匹配开头
      
          # =====2.以结尾进行匹配=====
          get_latest_file(conn, ver_dir, path, extension)  # 以结尾查找
      
          # =====以开头行匹配=====
          # get_latest_file(conn, ver_dir, path, extension,flag=True)  # 以开头进行查找
      
          # =====3.下载文件=====
          down_files(conn, res_list)

       

标签:匹配,python,res,list,file,pysmb,path,deb,conn
From: https://www.cnblogs.com/liqi175/p/17434441.html

相关文章

  • 分享Python采集77个焦点图,总有一款适合您
    Python采集的77个焦点图下载链接:https://pan.baidu.com/s/1DwOhWYWWRYHnAy-ZwWBTmg?pwd=xj5a提取码:xj5ajQuery全屏背景跟随手风琴图片切换特效HTML5焦点图片波浪过渡效果切换动画特效jQuery+HTML53D折页图片切换特效jQuery图片手风琴滑动展开特效jQuery点击右侧按钮图片滑动切换......
  • python 名称空间与作用域(笔记整理)
    一、名称空间什么是名称空间:名称空间就是存放变量名和变量值绑定关系的地方就是内存地址在程序执行期间最多会存在三种名称空间:内置名称空间:是Python解释器默认预定义大量内置函数和内置异常的名称空间,就是存放解释器自带函数方法的名称空间可以通过dir(builtins)来......
  • 01.初识Python
    本教程计划通过100天的时间,每天分享一篇关于python的知识点,与大家一起学习python这门编程语言。Python对初学者来说是一门很棒的语言:容易学有一个积极的支持社区在网络开发、游戏、数据科学方面提供多种机会。Python的应用领域目前Python在Web应用开发、云基础设施、De......
  • python 函数的参数(笔记整理)
    一、形参与实参介绍函数的参数分为形式参数和实际参数:简称形参和实参在定义函数阶段依次填写的参数名字,称为:形式参数(也称为形参)作为函数的输入,以便在函数内部进行处理。而在调用函数阶段,函数名括号中需要传入具体的值作为实际参数(也称为实参),这些实参会被赋值给函数中的形参,......
  • python 创建、拷贝、移动、删除文件和文件夹
    python创建、拷贝、移动、删除文件和文件夹1、创建文件夹importosdefcreate_folder(folder:str):folder=os.path.abspath(folder)ifnotos.path.exists(folder):try:os.makedirs(folder)print(f"创建了文件夹:{folder}"......
  • 基于 python 的 nexus 私服 jar 包匹配查找程序
    程序通过计算jar包的sha1摘要,到maven仓库查询对应路径,适用于NexusRepositoryManagerOSS2.14.11-01,其他版本未做测试注意:jar包路径中不要出现空格#!/usr/bin/python3importhashlibimportosimportrequestsimportsysimporttempfilefromxml.etreeimport......
  • python · matplotlib | 如何绘制子图
    代码:importmatplotlib.pyplotaspltimportmatplotlibmatplotlib.rc("font",family='MicroSoftYaHei',weight="bold")fig,axs=plt.subplots(2,2,figsize=(15,12))colors=['blue','orange','green&#......
  • 如何让python程序在windows下开机启动
    说明简述:通过将启动脚本写入注册表\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run来实现开机自启问题:这种开机启动比较奇怪,运行路径是cmd.exe的路径,所以执行需要自启的程序时,读取其他相对路径的文件会有错误解决:执行启动前,切一下目录启动脚本importos......
  • Python工具箱系列(三十三)
    Timescaledb在物联网时代,出现了大量以时间为中心海量产生的传感器数据,称为时序数据。这类数据的特点是:数据记录总有一个时间戳。数据几乎总是追加,不更新也不删除。大量使用近期的数据。很少更新或者回填时间间隔的缺失数据。与时间间隔频率关系不大。但累积的数据量大,可能会有峰值......
  • python升级pip失败的最终解决办法
    玩点python卡在pip安装包上了,我用的是pycharm,在它的交互命令行里使用python-mpipinstall--upgradepip始终报错!Traceback(mostrecentcalllast):File"d:\soft\python3.7\lib\site-packages\pip\_vendor\urllib3\response.py",line331,in_error_catcheryield......