前两天要做一个功能,由客户端上传一个zip包,服务端对这个zip包进行解压,并且对这个文件夹下的所有文件进行md5,并将文件重命名为文件md5码+文件后缀,保存原文件名与md5码之间的映射关系。想想这个功能由shell进行实现应该是很简单的。假设解压文件夹后有以下文件
[root@zixun-app-test conf]# ll total 100 -rw-r--r-- 1 www www 1418 Jun 25 10:30 aaa.xml -rw-r--r-- 1 www www 2510 Jun 25 10:30 bbb.xml -rw-r--r-- 1 www www 11674 Jun 25 10:30 ccc.xml -rw-r--r-- 1 www www 4916 Jun 25 10:30 ddd.xml -rw-r--r-- 1 www www 4199 Jun 25 10:30 eee.xml -rw-r--r-- 1 www www 2754 Jun 25 10:30 fff.xml -rw-r--r-- 1 www www 1778 Jun 25 10:30 ggg.xml -rw-r--r-- 1 www www 2653 Jun 25 10:30 hhh.xml -rw-r--r-- 1 www www 1798 Jun 25 10:30 iii.xml -rw-r--r-- 1 www www 42974 Jun 25 10:30 jjj.xml -rw-r--r-- 1 www www 1134 Jun 25 10:30 log4cplus.properties
首先尝试将原文件的文件名与文件后缀名分离开来
[root@zixun-app-test conf]# ls * | ( while read args;do (name=${args%.*};extend=${args#*.};echo $name===$extend;);done) aaa===xml bbb===xml ccc===xml ddd===xml eee===xml fff===xml ggg===xml hhh===xml iii===xml jjj===xml log4cplus===properties
然后尝试将文件名的md5提取出来
[root@zixun-app-test conf]# ls * | ( while read args;do (name=${args%.*};extend=${args#*.};md5=eval md5sum $args;md5=${md5% *};echo $md5);done) a004c496577c19dc8d34345b9487fe3d aaa.xml dbe19af0758dedf40d78c7df932819e0 bbb.xml 44302ddd0ff20d1c2e2db9740991c807 ccc.xml eb564f1310c8cf4061e6373930bdde46 ddd.xml 73eddc9a927804ac3970140677d1e523 eee.xml f9e84a4ceb73d41234d20e3c62cc01fa fff.xml 94477774308310d99cdb6ba052425928 ggg.xml a8e9d69c969f6ba16ea2104f2f46c3ad hhh.xml 78e58363ac2854036e8bbbc399d92a85 iii.xml 503b1212bae24f269a65dce1839d96c6 jjj.xml e8abce58f9c2aadd919ab1b166d68cf3 log4cplus.properties
奇怪的是我没有打印文件名,这文件名哪来的呢,去掉多除的部分先看看。
[root@zixun-app-test conf]# ls * | ( while read args;do ( md5sum $args);done) a004c496577c19dc8d34345b9487fe3d aaa.xml dbe19af0758dedf40d78c7df932819e0 bbb.xml 44302ddd0ff20d1c2e2db9740991c807 ccc.xml eb564f1310c8cf4061e6373930bdde46 ddd.xml 73eddc9a927804ac3970140677d1e523 eee.xml f9e84a4ceb73d41234d20e3c62cc01fa fff.xml 94477774308310d99cdb6ba052425928 ggg.xml a8e9d69c969f6ba16ea2104f2f46c3ad hhh.xml 78e58363ac2854036e8bbbc399d92a85 iii.xml 503b1212bae24f269a65dce1839d96c6 jjj.xml e8abce58f9c2aadd919ab1b166d68cf3 log4cplus.properties
汗一下,原来是md5sum的输出。基础不过关啊。
再想一下,既然要保存md5到原文件名的映射,而md5sum的输入不刚刚好符合要求么。那就直接先将md5sum的结果写文件吧。简写成的shell为:
#!/bin/bash #文件名:updateconf.sh #作者:xiaoruoen #时间:2013-06-21 #描述:用来将上传上来的客户端conf.zip解压到apps目录下,并将里面的文件以md5命名 rm -rf conf unzip conf.zip >/dev/null if [ $? -ne 0 ]; then echo -3 exit 0 fi; cd conf #生成md5文件 ls * | xargs -I {} md5sum {} >> md5.txt if [ $? -ne 0 ]; then echo -5 exit 0 fi #保存md5文件,用来生成映射关系 \cp md5.txt ../confmd5.txt #重命名解压出来的文件 while read line do arr=($line) oldname=${arr[1]} extend=${oldname#*.} newname=${arr[0]}.$extend mv $oldname $newname >/dev/null if [ $? -ne 0 ]; then echo -6 exit 0 fi done < md5.txt rm -rf md5.txt