# !/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 = "qi.li@gg.net" # 用户名,改成你自己的
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)