shell 百例收集4 自動解壓文件夾的壓縮文件

公司平時都會上傳一些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/^.//'  刪除第一個字符 .$最後一個字符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章