Last active
August 29, 2015 14:15
-
-
Save tyr0chen/cf4359b7272b0746ed51 to your computer and use it in GitHub Desktop.
Get more information in http://www.chenhd.com/shell-autoindex/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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