前两天要做一个功能,由客户端上传一个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