使用Curl从Artifactory仓库下载最新文件失败求助
问题背景
我的Artifactory服务上有如下文件结构(包含不同版本的zip文件及对应时间戳):
https://MYARTIFACTORYSERVIER/artifactory/mypath/releases/1.01zsomefilec5e5070b.zip 25-Jan-2022 09:49 https://MYARTIFACTORYSERVIER/artifactory/mypath/releases/2.01zsomefilec1e3070b.zip 03-Mar-2022 14:46 https://MYARTIFACTORYSERVIER/artifactory/mypath/releases/3.01zsomefilec556073b.zip 08-Jul-2022 12:27 https://MYARTIFACTORYSERVIER/artifactory/mypath/releases/4.01zsomefile25e5370b.zip 11-Jul-2022 12:27
我想用Curl结合Shell脚本,把最新版本(4.01,对应最新时间戳)的文件下载到Windows本地c:\temp目录,写了如下脚本:
ART=https://MYARTIFACTORYSERVIER/artifactory/mypath/releases curl .. "$ART/" > "*somefile*.*zip" LATEST=$(sed -ne '/href=/{s@.*href=".*/\([0-9]\+_[^"]\+\).*@\1@p}' < "*somefile*.*zip" | sort -nr | head -1) curl --insecure -o c:\\temp\\testfile.zip ... "$ART/$LATEST"
脚本能执行,但生成的文件数据不正确,也不是期望的最新zip文件;但直接用Curl下载单个指定文件是正常的,比如:
curl -o c:\temp\somefile.zip "https://MYARTIFACTORYSERVIER/artifactory/mypath/releases/1.01zsomefilec5e5070b.zip"
求解决该问题的思路。
解决思路
修复目录列表的下载与解析逻辑
- 你当前
curl .. "$ART/" > "*somefile*.*zip"的写法存在多处错误:..是无效参数,且Windows下shell对带通配符的文件名处理逻辑混乱,应该先将Artifactory目录的HTML页面下载到明确的文本文件,比如curl -k "$ART/" > dir_list.html(-k对应--insecure,和后续脚本的证书校验逻辑一致)。 - 原sed正则表达式完全不匹配实际文件名格式:文件名版本用
.分隔(如1.01),但正则里写了[0-9]\+_(匹配数字加下划线);同时"是HTML转义引号,应直接用"处理。针对你的文件名格式,可修改为:sed -n 's/.*href="\([0-9]\+\.[0-9]\+zsomefile[^"]\+\.zip\)".*/\1/p' dir_list.html,以此提取完整的zip文件名。
- 你当前
改用时间戳排序(比版本号更可靠)
版本号可能出现非常规格式(如1.10字符串排序会比1.9靠后,但实际版本更高),因此更稳妥的方式是结合文件时间戳判断最新文件:- 下载目录列表时,让Artifactory输出易解析的文本格式:
curl -k "$ART/?list",Artifactory会返回包含时间、大小、文件名的纯文本列表,比HTML页面更易处理。 - 对返回结果做过滤排序,提取最新文件名:
该命令会过滤出zip文件行,按时间倒序排序后取第一行的文件名。curl -k "$ART/?list" | grep -E "([0-9]{2}-[A-Za-z]{3}-[0-9]{4} [0-9]{2}:[0-9]{2}).*\.zip" | sort -k1,2r | head -1 | awk '{print $4}'
- 下载目录列表时,让Artifactory输出易解析的文本格式:
适配Windows环境的路径与Shell特性
- 若使用Git Bash等类Unix Shell,路径用
/c/temp/testfile.zip比c:\\temp\\testfile.zip更不易出错。 - 避免在输出文件名中使用通配符,务必用明确文件名,防止文件内容混乱。
- 若使用Git Bash等类Unix Shell,路径用
分步验证每一步输出
在脚本中添加echo命令验证每一步结果:比如下载目录列表后查看文件内容是否正确;提取文件名后执行echo $LATEST,确认是否为期望的4.01zsomefile25e5370b.zip;最后拼接完整URL,手动用Curl测试该URL能否下载正确文件。
内容的提问来源于stack exchange,提问作者luckyman80
相关产品推荐
相关产品推荐

