AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 463012
Accepted
Rey Leonard Amorato
Rey Leonard Amorato
Asked: 2014-05-09 10:42:36 +0800 CST2014-05-09 10:42:36 +0800 CST 2014-05-09 10:42:36 +0800 CST

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

  • 772

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

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

Ubuntu 的文件传输对话框

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

注意: 我只有 shell 脚本的基本知识,其他的不多。

wget
  • 1 1 个回答
  • 6731 Views

1 个回答

  • Voted
  1. Best Answer
    Glutanimate
    2014-05-11T16:42:55+08:002014-05-11T16:42:55+08:00

    使用 YAD 的解决方案


    概述

    Zenity 好久没更新了。幸运的是,有一个名为YAD的分支具有许多附加功能。它尚未到达官方存储库,但您可以从 webupd8 PPA 安装它:

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

    YAD 添加的功能之一是多​​进度条对话框。以下是 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 <space-delimited URLs>
    #               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 <space-delimited URLs>"
    
    # Set GUI variables up
    TITLE="YAD wget downloader"                 # dialog title
    TEXT="<b>Downloads</b> 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":

    在此处输入图像描述

    • 30

相关问题

  • 如果响应时间 > 5 秒,Wget 安排发送邮件

  • 如何为 wget 提供用户名和密码?

  • wget 下载损坏的 JPEG 文件

  • 为什么应用系统范围的网络代理设置只影响超级用户(root)?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve