需求: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賦予變量,以此類推。