BASH脚本差异生成升级热更新包
2016-09-19 12:00
295 查看
这几天系统学习了Bash的语法,想着写点什么加深一下记忆,曾经用C++实现过差异生成升级热更新包,其实里面大量使用了Shell命令,何不重写一个?近几天发现自己已经一年多不曾更新CSDN博客啦,我一直认为这是一个好习惯,我要继续下去。写这篇文章的前因已经交待清楚,那么就开始本文的主要内容吧。
这里直接贴源码,然后关键的地方我会作注解
16-19 检查参数
22-31 检查该版本是否生成过(检查md5文件是否存在),若存在提醒用户是否删除相关文件重新生成
34 生成版本文件,主要目的是为了防止空热更新包的存在,举例说明:初始0版本,1版本中增加文件,2版本正好删除1版本中所增加的文件,如此以来,更新包0_to_2应该是没有内容,由于zip命令不能压缩空包,会报错,zip error: Nothing to do!,所以我就增加了每个版本都会被脚本修改的版本文件。(关于不能压缩空包,或许是我没有找到正确姿势,高手看到,望告知)
36 遍历项目,生成md5文件,递归遍历的方法也是我百度出来的,md5命令 -r 选项是为了格式化输出,便于下面使用该md5文件,请参考man md5
38-55 循环以行读文件,分割md5值和文件名称,比对往期版本该文件是否被修改,若修改则拷贝至相应目录,拷贝之前需要先创建目标文件夹,mkdir命令 -p 选项是为了创建中间目录,譬如创建 /home/panshiqu/image 将会连同 panshiqu 目录一起创建。
58-60 zip压缩不同版本之间的升级热更新包,这里特别说 -j 选项,只存储名字要保存的文件,忽略路径,和文件夹名,关于这个选项你可以自行尝试一下,更多请参考man zip
26 用户输入小写转大写,截取第一个字符,是否是 Y
51 读取往期版本md5文件,查找记录着指定文件名称的行,awk分割取记录md5值,与当前版本文件md5值进行比较
关于以上两点,比较部分我加了双引号,若不加解析Bash语法就会出错,这应该是像我这样的新手经常会犯的错误啦
我认为该脚本有两点可以改进的地方
1.其实我应该统一创建目标目录结构,方便拷贝修改文件,因为我在循环内部每次判断该目录是否存在,若不存在就创建,这样同一个目录是会被判断多次的,想知道为什么这样你大可以bash -x hot.sh调试感受一下。
2.我同样也认为每次读往期版本md5文件,查找然后比较是一个高消耗的操作,作为学习的产物,暂时就这样吧。
====本文内容已完,宣传我的项目====
欢迎关注《休闲益智游戏》微信服务号
www.iplaygame.com.cn
谢谢
这里直接贴源码,然后关键的地方我会作注解
#! /bin/bash traverse() { for item in $1/*; do if [ -d $item ]; then #echo $item "is dir" traverse $item elif [ -f $item ]; then #echo $item "is file" md5 -r $item >> $md5file fi done } #check args if [ $# != 1 ]; then echo "Usage: $0 version" exit fi #check md5 file md5file="publish/$1.md5" if [ -f $md5file ]; then echo "version" $1 "exists" read -p "clear it? [Y/n]" ch if [ "$(echo $ch | tr '[a-z]' '[A-Z]' | cut -c 1)" == "Y" ]; then rm -rf publish/$1* else exit fi fi #log version echo $1 > project/version traverse project cat $md5file | while read line; do md5=${line:0:32} name=${line:33} #diff version for (( i=0; i<$1; i++ )); do path=${name/#project/publish\/${1}\/${i}_to_${1}} path=${path%/*} if [ ! -d $path ]; then mkdir -p $path fi if [ "$(cat publish/$i.md5 | grep $name | awk '{ print $1 }')" != "$md5" ]; then cp $name $path fi done done #zip for (( i=0; i<$1; i++ )); do zip -jqr publish/${1}/${i}_to_${1} publish/${1}/${i}_to_${1}/* done
16-19 检查参数
22-31 检查该版本是否生成过(检查md5文件是否存在),若存在提醒用户是否删除相关文件重新生成
34 生成版本文件,主要目的是为了防止空热更新包的存在,举例说明:初始0版本,1版本中增加文件,2版本正好删除1版本中所增加的文件,如此以来,更新包0_to_2应该是没有内容,由于zip命令不能压缩空包,会报错,zip error: Nothing to do!,所以我就增加了每个版本都会被脚本修改的版本文件。(关于不能压缩空包,或许是我没有找到正确姿势,高手看到,望告知)
36 遍历项目,生成md5文件,递归遍历的方法也是我百度出来的,md5命令 -r 选项是为了格式化输出,便于下面使用该md5文件,请参考man md5
38-55 循环以行读文件,分割md5值和文件名称,比对往期版本该文件是否被修改,若修改则拷贝至相应目录,拷贝之前需要先创建目标文件夹,mkdir命令 -p 选项是为了创建中间目录,譬如创建 /home/panshiqu/image 将会连同 panshiqu 目录一起创建。
58-60 zip压缩不同版本之间的升级热更新包,这里特别说 -j 选项,只存储名字要保存的文件,忽略路径,和文件夹名,关于这个选项你可以自行尝试一下,更多请参考man zip
26 用户输入小写转大写,截取第一个字符,是否是 Y
51 读取往期版本md5文件,查找记录着指定文件名称的行,awk分割取记录md5值,与当前版本文件md5值进行比较
关于以上两点,比较部分我加了双引号,若不加解析Bash语法就会出错,这应该是像我这样的新手经常会犯的错误啦
我认为该脚本有两点可以改进的地方
1.其实我应该统一创建目标目录结构,方便拷贝修改文件,因为我在循环内部每次判断该目录是否存在,若不存在就创建,这样同一个目录是会被判断多次的,想知道为什么这样你大可以bash -x hot.sh调试感受一下。
2.我同样也认为每次读往期版本md5文件,查找然后比较是一个高消耗的操作,作为学习的产物,暂时就这样吧。
====本文内容已完,宣传我的项目====
欢迎关注《休闲益智游戏》微信服务号
www.iplaygame.com.cn
谢谢
相关文章推荐
- SQL SERVER 数据库 批量 脚本 升级 更新工具 (C# .Net 2.0)
- 升级包自动生成脚本
- 项目产品化升级数据库脚本问题——如何查询两个数据库差异的库表或者数据
- 在线升级FlashPlayer和GoogleChrome的bash脚本
- 切合OTA升级的版本升级包自动生成脚本
- SQL中,怎么样自动生成表的更新脚本
- 编写bash脚本来更新mongo数据库数据
- BASH 脚本制作简单 Workflow - 更新 2014/6/17 12:00
- Beyond Compare脚本:命令行批量比较文件并生成html格式的差异报告
- Java提取两个文件夹中的有差异的文件并生成相应的shell脚本
- E: oss4-dkms: 子进程 脚本出错post-installation 安装升级更新时出错的解决方法
- Bash:如何不用写脚本的情况下建立一个目录,然后在其中生成一组有规律的文件.
- BASH脚本(ok2makefile):生成带有makefile的C++ "Hello world"程序
- PowerDesigner 如何生成数据库更新脚本
- 生成cscope.out的bash脚本
- 手动升级X-Scan–通过nessus nasl脚本更新X-Scan漏洞库
- 比较Oracle 的2个数据库的结构差异,生成更新语句
- PowerDesigner中从注释生成Name的两个升级VBS脚本
- Bash下的实用小脚本(不定期更新)
- Android OTA升级包制作脚本详解(生成升级脚本updater-script)