天天看點

Linux環境下通過Shell實作檔案目錄複制進度監控

需求:Linux環境下,有一目錄A下存放某類檔案N個,現需将該目錄A下檔案複制到建立目錄B中,由于檔案數量較大,需通過Shell監控複制進度。

Shell實作:

方法1:while無限循環(目的目錄下無限期執行)

#!/bin/bash
#
while :
do 
    CountN=$(ls -lR|grep "^-"|wc -l)
    echo -e "已複制檔案數;$CountN"
    sleep 10
done           

方法2:while無限循環(指定目錄參數與停止條件)

#!/bin/bash
#
sdir=$1 #原始目錄
ddir=$2    #目的目錄
while : #while無限循環用":"
do 
    SN=$(ls -lR $sdir|grep "^-"|wc -l) #原始目錄下檔案總數
    DN=$(ls -lR $ddir|grep "^-"|wc -l) #目的目錄下檔案總數
    R=$(awk 'BEGIN{printf "%.2f%\n",('$DN'/'$SN')*100}') #完成比例
    echo -e "總檔案數:SN  已複制檔案數;DN 完成率:R"
    if [ $DN -eq $SN ] #如果檔案已傳完,則退出循環
    then
        echo -e "傳輸完成!"
        break
    else
        sleep 10 #間隔時間,機關秒
    fi
done           

方法3,采用for條件循環(傳輸完成自動停止)

#!/bin/bash
#
sdir=$1    #參數,原始目錄
ddir=$2    #參數,目的目錄
SN=$(ls -lR $1|grep "^-"|wc -l) #原始目錄下檔案總數
DN=$(ls -lR $2|grep "^-"|wc -l) #目的目錄下檔案總數
for (((i=DN;i<=SN;i=DN)) #如果檔案已傳完,則退出循環
do 
    DN=$(ls -lR $2|grep "^-"|wc -l) #目的路徑下檔案總數
    R=$(awk 'BEGIN{printf "%.2f%\n",('$DN1'/'$SN1')*100}')    #完成比例
    echo -e "總檔案數:$SN  已複制檔案數;$DN 完成率:$R"
    sleep 10 #間隔時間,機關秒
done
echo -e "傳輸完成!"           

擴充

for循環:

形式1:條件循環
for ((初始值;循環控制條件;變量變化))
do
程式
done           

其中:

1)初始值:在循環開始時,需要給某個變量賦予初始值,如 i=1。

2)循環控制條件:用于指定變量循環的次數,如 i<=100,則隻要 i 的值小于等于 100,循環就會繼續。

3)變量變化:每次循環之後,變量該如何變化,如 i=i+1,代表每次循環之後,變量的值都加 1。

形式2:數值性循環
for 變量 in 值1 值2 值3…
do
程式
done           

環的次數取決于in後面值的個數(以空格分隔),有幾個值就循環幾次,并且每次循環都把值賦予變量。 in 後面有三個值,for 會循環三次,第一次循環會把值1賦予變量,第二次循環會把值2賦予變量,以此類推。

繼續閱讀