脚本用于检查压缩包中的文件是否正常,尤其是编译生成的制品文件,涵盖最常见的压缩类型,如apk/aar/ear/jar/war/tar.gz/tgz/zip。

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#!/bin/bash # 功能:校验压缩包中的文件 # 外层文件包类型:apk/aar/ear/jar/war/tar.gz/tgz/zip # 内嵌文件包类型:jar/war/zip # 默认校验脚本当前所在位置的$tarFile.tar # 指定扫描目录:d(脚本相对路径且优先执行) # 指定扫描文件:f(脚本相对路径且带扩展名) checkLog="${PWD}/check_package.log" colorRED="\033[31m" colorGRN="\033[32m" colorYEL="\033[33m" colorEND="\033[0m" while getopts ':d:f:' OPT do case ${OPT} in d) dirPath="$OPTARG";; f) pkgFile="$OPTARG";; esac done # 处理解压后可能存在的权限问题 [ sudo -n true 2>/dev/null ] && sudoCmd="sudo " errCode(){ chkCode=1 echo "【警告】解压文件包异常" echo "【警告】解压文件包异常:$pkgInfo" >> $checkLog } if [ -z "$dirPath" ] then [ -z "$pkgFile" ] && pkgFile="$tarFile.tar" [ ! -e $pkgFile ] && echo "【警告】制品文件不存在" && exit 1 echo ">>开始解压待校验制品包:$pkgFile" tmpDir1=$(mktemp -d) tar -xf $pkgFile -C $tmpDir1 || exit 1 fi if [ -n "$dirPath" ] then [ ! -d $dirPath ] && echo "【警告】工作目录不存在" && exit 1 tmpDir1="${dirPath}" fi for pkgName in `find $tmpDir1 -type f -name "*.[aejwt]ar" -o -name "*.apk" -o -name "*.gz" -o -name "*.zip"` do # 测验外层文件包 echo-e"$colorYEL【提示】校验外层文件包:$pkgName$colorEND" cmdType="unzip -t" [[ "${pkgName}" =~ \.(tar|tgz|gz)$ ]] && cmdType="tar -tf" [[ "${pkgName}" =~ \.gz$ && ! "${pkgName%.*}" =~ \.tar$ ]] && cmdType="gunzip -t" set +e if ! ${cmdType} "$pkgName" > /dev/null 2>&1 then chkCode=1 echo -e "$colorRED【警告】外层文件包损坏$colorEND" echo "【警告】外层文件包损坏:$pkgName" >> $checkLog continue fi # 特殊的gz文件包 [ "$cmdType" = "gunzip -t" ] && echo -e "$colorGRN【信息】外层文件包正常$colorEND" && continue # 解压外层文件包 echo -e "$colorYEL【提示】解压外层文件包$colorEND" tmpDir2=$(mktemp -d) cmdType="unzip -od $tmpDir2 $pkgName" [[ "${pkgName}" =~ \.(tar|tgz|gz)$ ]] && cmdType="tar --overwrite -xf $pkgName -C $tmpDir2" # 即使文件通过测试也不忽略解压时的异常状态 trap 'errCode && continue' ERR ${cmdType} > /dev/null 2>&1 echo -e "$colorGRN【信息】外层文件包正常$colorEND" # 测验内嵌文件包 for pkgInnr in `find $tmpDir2 -type f -name "*.[jw]ar" -o -name "*.zip"` do flag=0 echo -e "$colorYEL【提示】校验内嵌依赖包:$pkgInnr$colorEND" if ! unzip -t "$pkgInnr" > /dev/null 2>&1 then flag=1 echo -e "\t$colorRED【警告】内嵌依赖包损坏$colorEND" echo -e "【提示】校验外层文件包:${pkgName}\n\t【警告】内嵌依赖包损坏:$pkgInnr" >> $checkLog fi [ $flag -eq 0 ] && echo -e "\t$colorGRN【信息】内嵌依赖包正常$colorEND" || chkCode=1 done set -e $sudoCmd rm -rf $tmpDir2 done [ -z "$dirPath" ] && $sudoCmd rm -rf $tmpDir1 echo -e "\n$colorYEL---------------<已完成扫描>---------------$colorEND" cat $checkLog if [ "x$chkCode" = "x1" ] then echo -e "【失败】制品校验状态异常$colorEND" exit 1 fi |
原创文章禁止转载:技术学堂 » 校验压缩包中的文件是否正常

技术学堂














