我在 bash 脚本中使用以下命令从 ftp 服务器下载文件。此命令使用 -v 选项,该选项显示正在下载的每个文件的名称。
/usr/bin/lftp ftp://$ftpuser:$ftppass@$ftphost -e "$ftpsettings ;
mirror -v -e $remotemedia $localmedia ; quit"
我需要修改脚本,使用whiptail 显示进度条,以显示下载进度。这是进度条,但我不知道如何让它读取lftp下载进度。
{
for ((i = 0 ; i <= 100 ; i+=5)); do
sleep 0.1
echo $i
done
} | whiptail --gauge "Downloading file $name..." 6 50 0
我怎样才能做到这一点?
答案1
要计算百分比,您需要知道文件总数。您可以从ls -R
另一个内部获取它lftp
,从与您的命令相同的目录开始mirror
。我为“.”减去了 2。和列表中的“..”。
let total=$(lftp "ftp://$ftpuser:$ftppass@$ftphost" -e "$ftpsettings ;
ls -R $remotemedia; quit" | wc -l)-2
然后,您可以从lftp读取每一行输出,对于那些开始“传输”的行,您可以增加行计数器,计算百分比,并使用--gauge
接受(XXX,百分比,标题,XXX)的“XXX”输入样式。
lftp "ftp://$ftpuser:$ftppass@$ftphost" -e "$ftpsettings ;
mirror -v -e $remotemedia $localmedia ; quit" |
while read word word2 filename
do if [ "$word" = Transferring ]
then let count=count+1
let percent=count*100/total
echo -e "XXX\n$percent\nDownloading $filename\nXXX"
fi
done |
whiptail --title lftp --gauge progress 10 60 0
答案2
只是添加一个替代方案,以我的愚见,它比鞭尾(深受喜爱的 tqdm)效果更好。 Tqdm 可以通过选择的 pip 或 Yiur 包管理器安装。
要使用它,我们遵循相同的想法:首先获取文件数,然后回显循环中的迭代数并将其全部传送到 tqdm
let total=$(lftp "ftp://$ftpuser:$ftppass@$ftphost" -e "$ftpsettings ;
ls -R $remotemedia; quit" | wc -l)-2
lftp ftp://$ftpuser:$ftppass@$ftphost -e "$ftpsettings ;
mirror -v -e $remotemedia $localmedia ; quit" |
while read word word2 filename
do if [ "$word" = Transferring ]
then let count=count+1
echo "$count"
fi
done | tqdm --total $total