【熟能生巧】批量下载项目 TAR 包

问题

在工作中,部署工具一般只负责把tar/jar包上传到公司的一个中心服务器C上。如果我们在开发的服务器A上,要部署最新代码运行,还需要费一番周折。

观察到的开发人员常用的一个方法是:从服务器C先将包先下载到本机L,然后再从本机L上传到服务器A

当有多个项目(10+)时,这是一件非常繁琐的事。需要使用脚本将过程自动化。

中心服务器上的项目路径

在总目录/path/to/repository下,有多个项目project_1, project_2, project_3,每个项目内还有多个版本号。

/path/to/repository/project_1/p1_v1
/path/to/repository/project_1/p1_v2
/path/to/repository/project_1/p1_v3

/path/to/repository/project_2/p2_v1
/path/to/repository/project_2/p2_v2

/path/to/repository/project_3/p3_v1
/path/to/repository/project_3/p3_v2
/path/to/repository/project_3/p3_v3
/path/to/repository/project_3/p3_v4

我们需要下载的是,每个项目的最新版本:p1_v3p2_v2p3_v4

核心脚本

我们使用了wget进行下载。这里,难点在于:

  • 如何遍历所有的项目
  • 如何将无关项过滤
  • 如何选取最新版本

先上代码:

pkglst=$(wget -r --no-parent -A .tar -P temp  /path/to/repository/ |& grep "some_key_word" | awk '{print $NF}' | sort -V | awk -F '/' '{ map[$(NF-2)]=$0;} END{for( key in map) print map[key];}')

echo "$pkglst" | while read line; do
	echo $line
	wget -r -A .tar -P temp --no-parent $line 
done

下面做出说明:

download

  • wget -r: specify recursive download
  • wget --no-parent: don’t ascend to the parent directory
  • wget -A: accepted extensions
  • wget -P: save files to

pipeline

  • |&: equal to 2>&1 |
  • 2>&1: almost equal to redirect stderr to stdout

grep "some_key_word": 使用关键词过滤掉无用的文件

awk '{print $NF}': 选取最后的一项,即/path/to/repository/project_1/p1_v1,把时间戳过滤掉

sort -V: 按照版本号排序

awk -F '/' '{map[$(NF-2)]=$0;} END{for(key in map) print map[key];}': 选择最大的版本号

关于这里的awk还要做出额外的说明:

  首先,使用`/`作为分隔符,将整个字符串拆分。
  然后,选取倒数第二个字段作为key,选取整个字符串作为value。
  举例来说,就是[project_1] <-> [/path/to/repository/project_1/p1_v1]。
  一条一条循环下来,[project_1]的value会被不断更新,最终停留在最后一个[/path/to/repository/project_1/p1_v3]。
  因为上面已经按照版本号做过了排序,所以,最终留下即为最大版本号。

后续处理

在上面,我们将包下载到了一个temp的目录下,这里,需要将包从temp目录下导出到target目录下。

为什么要多一个temp目录呢?因为如果命令执行错误,或者网络错误,将只影响temp目录,而不会影响target目录。(最后文件拷贝的过程中的错误发生概率很小)

for f in $(find temp -name \*package.tar); do
	rm ./$(basename $f) &>/dev/null
	mv $f $(basename $f)
	if [[ $extract -eq 1 ]]
	then
		tar xvf $(basename $f)
		rm ./$(basename $f) &>/dev/null
	fi
	echo $(basename $f) >>download_info.txt
done

这里的步骤就挺好理解了,就是rm, mv, 然后根据一个变量$extract来决定要不要解压缩。

&>/dev/null: redirect stdout and stderr to null, like throw to trash bin

总结

  • 使用wget下载
  • 使用grep, awk, sort过滤
  • 使用rm, mv等移动文件
  • 使用tar解压缩
posted @   MaxStack  阅读(165)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战
· AI工具推荐:领先的开源 AI 代码助手——Continue
点击右上角即可分享
微信分享提示