zoukankan      html  css  js  c++  java
  • 【熟能生巧】批量下载项目 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解压缩
  • 相关阅读:
    【转载】C#使用Split函数根据特定分隔符分割字符串
    【转载】 Asp.Net安全之防止脚本入
    【转载】C#使用as关键字将对象转换为指定类型
    【转载】C#使用is关键字检查对象是否与给定类型兼容
    【转载】C#将字符串中字母全部转换为大写或者小写
    【转载】使用Response.WriteFile输出文件以及图片
    【转载】常见面试题:C#中String和string的区别分析
    【转载】Asp.Net中Cookie对象的作用以及常见属性
    【转载】C#指定文件夹下面的所有内容复制到目标文件夹下面
    【转载】Asp.Net中应用程序的事件响应次序
  • 原文地址:https://www.cnblogs.com/maxstack/p/13786802.html
Copyright © 2011-2022 走看看