複数のプログレスバーを持つwget GUIを作成するにはどうすればよいですか?


21

を使用して複数のアイテム(同時に、コマンドごとに1つのアイテム)をダウンロードする独自のスクリプトを作成していますwgetが、プログレスバーが必要です。現在zenity --progress、進行状況バーに利用していますが、問題はダウンロード時に複数の進行状況バーが表示されることです。

私が達成したいのは、Nautilusのファイル転送ダイアログに似たものです。

Ubuntuのファイル転送ダイアログ

誰がこれを達成するプログラムまたは言語に関して正しい方向に私を指すことができますか?

注: 私はシェルスクリプトの基本的な知識しか持っていません。


試しましたaxel-kaptか?sudo apt-get install axel-kapt

賞金はほぼ終わりに近づいています。あなたが私の答えに満足しているなら、それを割り当てることを忘れないでください。
グルタニメート

問題ありません スクリプトの幸運を祈ります!
グルタニメート

回答:


28

YADを使用したソリューション


概要

Zenityはかなり前から更新されていません。幸いなことに、多くの機能が追加されたYADと呼ばれるフォークがあります。まだ公式リポジトリには届いていませんが、webupd8 PPAからインストールできます。

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

YADに追加された機能の1つは、マルチプログレスバーダイアログです。複数のプログレスバーに関する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"

ここに画像の説明を入力してください


これは非常に包括的で興味深い投稿であり、私はこれまで見てきたことを気に入っています。私のこの小さなプロジェクトをいじくり回してくれてありがとう。:) Q1:完成したファイルの進行状況バーはどうなりますか?彼らは他のすべてが完了するまでダイアログに留まりますか?Q2:私が見ていることから、ダイアログから個々の操作をキャンセルする方法はありません、ありますか?
レイレナードアモラート

1
+1 yad; それは素晴らしいパッケージです。その点に注意してください--notification上のyad理由のUbuntuの13.04以降では動作しませんバグ1305835およびバグ1119420(バグのためのリンクや投票に従ってください)。
水田ランダウ

2
追加のコントロールを使用するには、GtkDialogにステップアップして、ほとんど何でもできるようにする必要があります。しかし、それはもっと複雑です。PuppyLinuxコミュニティは、PuppyLinuxコミュニティを幅広く活用しています。
DocSalvager

1
@Glutanimate-混乱を避けるための簡単なメモ:PuppyLinuxフォーラムの多くの参照は、「gtkdialog3」と「gtkdialog4」を参照しています。これらは、実際のGtkDialogバージョンの単純な同義語であり、一貫性すらありません。入手したバージョン0.8.3は最新のもので、非常に安定しています。(モデレーター:GtkDialogの詳細はこちら。興味がある方は、新しい質問を投稿してください。)
DocSalvager

1
@Glutanimate yad数か月使用しており、その力に非常に感銘を受けました。しかし、ここでのあなたの答えは、私自身のプログレスバーよりも先に見事に輝いて光年です。あなたのwget進行状況バーコードを自分のアプリaskubuntu.com/questions/900319/…に素早く適応させます。
WinEunuuchs2Unix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.