需求: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赋予变量,以此类推。