公司平時都會上傳一些ZIP的文件到服務器的一個目錄下,具體有三級目錄,現在要弄個腳本實現當上傳ZIP上去那個目錄
下的任何一個子目錄都會自動解壓
思路:找出目錄下所有ZIP文件 然後用一個循環進行自動解壓 最後刪除那個ZIP文件
例如:
a---->b-----c 三個文件夾 a 爲父目錄
#cd a
#find /aaa/ -name ‘*.zip’ 可以找出a目錄下zip的文件,注意*.zip要引號
[root@mysql1 /]# find /aaa/ -name '*.zip'
/aaa/jpeg.zip
/aaa/ha.zip
/aaa/hb.zip
/aaa/bbb/arp.zip
/aaa/bbb/b/jpeg.zip
/aaa/bbb/b/usr.zip
/aaa/http.zip
/aaa/arp.zip
[root@mysql1 /]# find /aaa/ -name '*.zip'|awk -F"/" '{$NF="" ;print $0}'|sed 's/[ ][ ]*/\//g'
/aaa/
/aaa/
/aaa/
/aaa/bbb/
/aaa/bbb/b/
/aaa/bbb/b/
/aaa/
/aaa/
awk -F"/" '{$NF="" ;print $0}' 打印最後一列以爲的
sed 's/[ ][ ]*/\//g'將多個空格替換成/
好了獲得ZIP的路徑 跟着要一個一個的刪除
/目錄下寫個腳本
vim unzip.sh
#!/bin/bash
while true
do
a=`find /aaa -name '*.zip'`
for i in $a
do
b=`echo $i |awk -F"/" '{$NF="" ;print $0}'| sed 's/[ ][ ]*/\//g'`
unzip -o $i -d $b
rm -r $i
done
sleep 5
done
chmod 755 unzip.sh
./unzip.sh
現在就5秒檢測一次有沒有新文件,有的話就解壓。
問題。。由於文件有上W個。按這樣的話每5秒就要find一次,太佔用資源啦。
後面打算利用觸發的形式來做,就是一發現有ZIP文件就馬上解壓
這樣的話就要藉助一個inotify-tools軟件了
下載:inotify-tools-3.13.tar.gz
# tar zxvf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure && make && make install
裝好了,嘗試運行
[root@mysql1 /]# /usr/local/inotify/bin/inotifywait -rme create /aaa
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
可以寫成 modify,delete,create,attrib 本例子只顯示新建的才觸發
打開一個新shell 在/aaa創建一個文件。
[root@mysql1 /]# /usr/local/inotify/bin/inotifywait -rme create /aaa
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/aaa/ CREATE hi **************************
馬上會顯示 /aaa/ CREATE hi
修改腳本
vim unzip.sh
/usr/local/inotify/bin/inotifywait -rme create /aaa \
| while read file
do
fd=${dir}${file}
ff=`echo "$fd" |awk '{print $1$3}'`
dd=`echo "$fd" |awk '{print $1}'`
zip=`echo ${ff:0-3:3}` ---獲取文件的最後三個字符
if [ $zip = "zip" ]; then
#echo "zip="$zip
#echo "f="$ff
#echo "d="$dd
unzip -o $ff -d $dd;rm -r $ff
fi
done
初步達到要求,以後再修改
awk顯示除最後一列外的所有列
find /aaa/ -name '*.zip'|awk -F"." '{$NF="" ;print $0}'
#find . -name '*.zip'|sed 's/^.//' 刪除第一個字符 .$最後一個字符