Skip to content

Instantly share code, notes, and snippets.

@tyr0chen
Last active August 29, 2015 14:15
Show Gist options
  • Save tyr0chen/cf4359b7272b0746ed51 to your computer and use it in GitHub Desktop.
Save tyr0chen/cf4359b7272b0746ed51 to your computer and use it in GitHub Desktop.
Get more information in http://www.chenhd.com/shell-autoindex/
#!/bin/bash
#=================匹配样式===============
pattern="^Internet Explorer [0-9]+$|^Windows Server (2003|2008|2008 R2|2012 and Windows Server 2012 R2)$|^Windows Vista$|^Windows 7$|^Windows 8 and Windows 8.1$|^Server Core installation option$|^ASP.NET MVC [2-5]\.[0-1]$|^Microsoft Office 20(07|10)$|^Microsoft Office for Mac$|^Other Microsoft Office Software$|^Microsoft SharePoint Server 2010$|^Microsoft Office Web Apps 2010$|^Microsoft Word Viewer$|^Microsoft Office Compatibility Pack Service Pack 3$|^Microsoft SharePoint Server 2010 Service Pack 2$"
#将完整的目录拆分为按照MS14-0XX来保存
for ((ci=56;ci<=79;ci++))
do
if [ "$ci" -eq "74" ];then #微软没有给MS14-075补丁,所以跳过这个
cat /home/ms-all | sed -n "/MS14-074/,/MS14-076/p" > /home/ms/MS14-074
ci=75
continue
fi
cat /home/ms-all | sed -n "/MS14-0$ci/,/MS14-0$((ci+1))/p" > /home/ms/MS14-0$ci
done
log_file=/home/ms.log
declare -i dirnum=1
for i in /home/ms/*
do
#匹配到模式一次,此dirnum++,用于创建矩阵
dirnum=1
#去除行首和行尾的空格,使得下面的模式可以精确匹配
sed -i 's/^\s*//g;s/\s*$//g' $i
#=================创建分类目录和矩阵===============
#抓取pattern并且使用tr把空格转换成连字符,方便mkdir
for j in `cat $i | egrep "$pattern"| tr ' ' '-'`
do
#对于抓取到的每个匹配分类采取操作
array[$dirnum]=$j #分类名记录到矩阵中
filename=${i##*/} #去除$i变量中的路径,只保留文件名,形似MS14-0XX
#创建目录并记录日志
mkdir -p /media/sandisk/ms-exe/$filename/$j >> $log_file 2>&1
#回显记录到标准输出和日志
echo "array[$dirnum]=$j" |tee -a $log_file
echo "mkdir /media/sandisk/ms-exe/$filename/$j " |tee -a $log_file
dirnum=dirnum+1
done
#=================为子分类构造有序序列===============
#由于子分类不具备统一的,sed可以匹配和处理的,有关联的关键字,因此这里构造出类似
#MS14-0XX这样含有数字递增关系的关键字,形似AAAA-X,X为数字,由1递增.这个设想想了
#很久,之前一直都在想如何直接处理
#每个补丁文件最多不超过十几个分类,于是循环次数设为20
for ((k=1;k<=20;k++))
do
#-i修改文件,-r支持扩展正则表达式
#sed定位行也支持正则表达式,而且是非贪婪的!于是这里的想法就是从第一行开始
#到第一个pattern匹配出,每抓取到一次Pattern就修改为相应的AAAA-$k,于是下次
#抓取时,结束行继续向下拉取到下一次匹配pattern的地方.不要问我为什么不用
#sed 's/aa/AA/1',两张图让你们明白.这里我也是卡了好久才想到了这么个凑合的
#方法...
sed -i -r "1,/$pattern/s/$pattern/AAAA-$k/" $i
done
#=================处理每一个子分类(也即AAAA)之间的内容===============
#处理每一个AAAA之间的内容,也就是具体的补丁文件
for ((z=1;z<=20;z++))
do
#由于补丁只有四种扩展名:exe|dmg|msu|msi 于是这大大方便了我们的操作
#使用sed的行处理来打印两个AAAA之间的内容,交给egrep抓取补丁名称
exe=`cat $i | sed -n "/AAAA-$z/,/AAAA-$((z+1))/p" | egrep "exe|dmg|msu|msi"`
#20此循环肯定多了,这里做了一个判空
if [ -n "$exe" ];then
for kk in $exe
#这一层循环用于遍历每一个补丁文件
do
echo "copying $kk to /media/sandisk/ms-exe/$filename/${array[$z]}" | tee -a $log_file
#复制到相应的目录.
#这里就可以解释为什么需要矩阵了.因为我做了子分类到AAAA之间的映射,并且使用sed更改了原始文件
#所以使用矩阵中存储的分类名可以直接定位复制到哪个目录,不然只根据AAAA是无法判别的.
cp -n /media/sandisk/ms/$kk /media/sandisk/ms-exe/$filename/${array[$z]} >> $log_file 2>&1
done
fi
done
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment