如何创建具有多个进度条的wget GUI?

我正在编写自己的脚本来使用wget下载多个项目(同时,每个命令一个项目),我需要一个进度条。 我目前使用zenity --progress进行我的进度条,但问题是它在下载时产生了多个进度条。

我想要实现的是类似于Nautilus中的文件传输对话框:

Ubuntu的文件传输对话框

任何人都可以指出哪个程序或语言可以实现这一目标的正确方向。

注意:我只掌握shell脚本的基本知识,而不是其他。

使用YAD的解决方案


概观

Zenity在很长一段时间内没有更新。 幸运的是,有一个名为YAD的分支,具有许多附加function。 它尚未到达官方存储库,但您可以从webupd8 PPA安装它:

 sudo add-apt-repository ppa:webupd8team/y-ppa-manager sudo apt-get update sudo apt-get install yad 

添加到YAD的function之一是多​​进度条对话框。 以下是YAD关于多个进度条的手册的摘录:

 Multi progress bars dialog options --bar=LABEL[:TYPE] Add progress bar. LABEL is a text label for progress bar. TYPE is a progress bar type. Types are: NORM for normal progress bar, RTL for inverted progress bar and PULSE for pulsate progress bar. --vertical Set vertical orientation of progress bars. --align=TYPE Set alignment of bar labels. Possible types are left, center or right. Default is left. Initial values for bars set as extra arguments. Each lines with progress data passed to stdin must be started from N: where N is a number of progress bar. Rest is the same as in progress dialog. 

因此,一个包含多个进度条的非常简单的脚本可能如下所示:

 for i in {1..100}; do printf "1:$i\n2:$i\n3:$i\n" sleep 0.2 done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM 

这就是结果:

简单的yad多进程脚本


我们可以使用# :向条形添加描述:

 for i in {1..100}; do printf "1:$i\n2:$i\n3:$i\n" printf "1:#Progress 1 is at $i percent\n2:#Progress 2 is at $i percent\n3:#Progress 3 is at $i percent\n" sleep 0.2 done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM 

结果:

在此处输入图像描述


如果我们想在wget下载脚本中实现这一点,我们首先要做的事情是:

  • 找到一种从wget输出中提取下载进度和其他有趣数据的方法
  • 找到一种迭代多个文件的方法
  • 找到一种方法将我们拥有的所有信息传递给一个单一的yad对话框

我发现这个项目相当有趣,所以我坐下来编写了一个应该完成上述所有操作的脚本。


yad_wget

这就是我想出的:

 #!/bin/bash # NAME: yad_wget # VERSION: 0.2 # AUTHOR: (c) 2014 Glutanimate # DESCRIPTION: graphical frontend to wget in form of a yad script # FEATURES: - display progress of multiple simultaneous downloads # - set maximum number of simultaneous downloads # DEPENDENCIES: yad # # Install yad on Ubuntu with: # # sudo add-apt-repository ppa:webupd8team/y-ppa-manager # sudo apt-get update # sudo apt-get install yad # # LICENSE: GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html) # # NOTICE: THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. # EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES # PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR # IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND # PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, # YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. # # IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY # COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS # PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, # INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE # THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED # INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE # PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER # PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. # # USAGE: yad_wget  # Closing the yad dialog will terminate all downloads in progress # Variables and settings MAXDLS="5" # set maximum number of simultaneous downloads URILIST="$@" # gets list of URIs from stdin USAGE="$0 " # Set GUI variables up TITLE="YAD wget downloader" # dialog title TEXT="Downloads in progress:" # dialog text ICON="emblem-downloads" # window icon (appears in launcher) IMAGE="browser-download" # window image (appears in dialog) #URILIST="http://proof.ovh.net/files/100Mb.dat http://speedtest.wdc01.softlayer.com/downloads/test10.zip http://cachefly.cachefly.net/100mb.test" # Usage checks if [[ -z "$URILIST" ]] then echo "Error: No arguments provided" echo "Usage: $USAGE" exit 1 fi # download file and extract progress, speed and ETA from wget # we use sed regex for this # source: http://ubuntuforums.org/showthread.php?t=306515&page=2&p=7455412#post7455412 # modified to work with different locales and decimal point conventions download(){ wget "$1" 2>&1 | sed -u \ "s/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/$2:\1\n$2:# Downloading at \2\/s, ETA \3/" RET_WGET="${PIPESTATUS[0]}" # get return code of wget if [[ "$RET_WGET" = 0 ]] # check return code for errors then echo "$2:100%" echo "$2:#Download completed." else echo "$2:#Download error." fi } # compose list of bars for yad for URI in $URILIST; do # iterate through all URIs FILENAME="${URI##*/}" # extract last field of URI as filename YADBARS="$YADBARS --bar=$FILENAME:NORM" # add filename to the list of URIs done IFS=" " COUNTER="1" DYNAMIC_COUNTER="1" # main # iterate through all URIs, download them in the background and # pipe all output simultaneously to yad # source: http://pastebin.com/yBL2wjaY for URI in $URILIST; do if [[ "$DYNAMIC_COUNTER" = "$MAXDLS" ]] # only download n files at a time then download "$URI" "$COUNTER" # if limit reached wait until wget complete DYNAMIC_COUNTER="1" # before proceeding (by not sending download() to bg) else download "$URI" "$COUNTER" & # pass URI and URI number to download() DYNAMIC_COUNTER="$[$DYNAMIC_COUNTER+1]" fi COUNTER="$[$COUNTER+1]" # increment counter done | yad --multi-progress --auto-kill $YADBARS --title "$TITLE" \ --text "$TEXT" --window-icon "$ICON" --image "$IMAGE" # ↑ launch yad multi progress-bar window 

这就是它的样子:

在此处输入图像描述

在此处输入图像描述

请务必阅读所有评论以了解该脚本的工作原理,如果您有任何疑问,请在下面的评论中提出疑问。


编辑:

我添加了对设置最大同时下载次数的支持。 例如,对于MAXDLS="5"

在此处输入图像描述