Birden çok ilerleme çubuğuna sahip bir wget GUI'yi nasıl oluşturabilirim?


21

Birden çok öğeyi (aynı anda komut başına bir öğe) indirmek için kendi komut dosyasını yazıyorum wgetve bir ilerleme çubuğuna ihtiyacım var. Şu anda zenity --progressilerleme çubukları için kullanıyorum , ancak sorun indirirken birden fazla ilerleme çubuğunun ortaya çıkması.

Ulaşmak istediğim Nautilus'taki dosya aktarım iletişim kutusuna benzer bir şey:

Ubuntu'nun dosya aktarımı iletişim kutusu

Biri beni, hangi programı veya dilleri başaracağına dair doğru yöne işaret edebilir mi?

NOT: Sadece kabuk komut dosyasıyla ilgili temel bilgilerim var, başka bir şey değil.


Denedin axel-kaptmi sudo apt-get install axel-kapt

Ödül, sonuna kadar oldukça yakın. Cevabımdan memnunsanız, lütfen atamayı unutmayın.
ta Glutanimate

Sorun yok dostum. Senaryonunla iyi şanslar!
Glutanimate

Yanıtlar:


28

YAD kullanarak çözüm


genel bakış

Zenity bir süredir güncellenmedi. Neyse ki birçok özellik eklenmiş YAD adında bir çatal var . Henüz resmi depolara ulaşmadı, ancak webupd8 PPA'dan yükleyebilirsiniz:

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

YAD'a eklenen özelliklerden biri çoklu ilerleme çubuğu diyalog penceresi. İşte YAD'ın çoklu ilerleme çubukları ile ilgili el kitabından bir alıntı:

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.

Böylece, çok basit bir çubukla birden çok ilerleme çubuğuna sahip bir komut dosyası şöyle görünebilir:

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

Sonuç şöyle görünür:

basit yad çoklu ilerleme betiği


Çubuklara şu açıklamaları ekleyebiliriz #:

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

Sonuç:

görüntü tanımını buraya girin


Bunu bir wget indirme komut dosyasında uygulamak istiyorsak önce birkaç şey yapmamız gerekecek:

  • İndirme ilerlemesini ve diğer ilginç verileri wget çıktısından çıkarmanın bir yolunu bulun
  • birden fazla dosya üzerinde yineleme yapmanın bir yolunu bulun
  • Tek bir yad iletişim kutusundaki tüm bilgileri iletmenin bir yolunu bul

Bu projeyi oldukça ilginç buldum, bu yüzden oturdum ve yukarıdakilerin hepsini yapması gereken bir senaryo yazdım.


yad_wget

İşte geldiğim şey:

#!/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

Ve işte böyle görünüyor:

görüntü tanımını buraya girin

           görüntü tanımını buraya girin

Komut dosyasının nasıl çalıştığını öğrenmek için tüm yorumları okuduğunuzdan emin olun ve herhangi bir sorunuz varsa, lütfen aşağıdaki yorumları sormaktan çekinmeyin.


Düzenle:

Maksimum eşzamanlı indirme sayısını ayarlamak için destek ekledim. Örneğin MAXDLS="5":

görüntü tanımını buraya girin


Bu çok kapsamlı ve ilginç bir yazı ve şu ana kadar gördüğümü beğeniyorum. Bu küçük projemle ilgilenmeye zaman ayırdığınız için teşekkür ederiz. :) S1: Tamamlanan dosyaların ilerleme çubuğuna ne olur? Her şey tamamlanana kadar diyalogda mı kalıyorlar? S2: Gördüğüm kadarıyla, bireysel işlemleri iletişim kutusundan iptal etmenin bir yolu yok, değil mi?
Rey Leonard Amorato

1
İçin +1 yad; harika bir paket. Unutmayın --notificationüzerinde yadUbuntu 13.04 ve daha sonra nedeniyle çalışmaz hata 1305835 ve hata 1119420 (böcek bağlantıları ve oy takip edin).
Paddy Landau

2
Daha fazla kontrol sahibi olmak için, hemen hemen her şeyi yapmanıza izin veren GtkDialog'a geçmeniz gerekir . Ancak, çok daha fazla ilgili. Puppy Linux toplumun bunun yoğun kullanımını kolaylaştırır.
DocSalvager 13:14

1
@Glutanimate - Çok fazla karışıklığı önlemek için kısa bir not: PuppyLinux forumlarındaki referansların çoğu "gtkdialog3" ve "gtkdialog4" e atıfta bulunur. Bunlar gerçek GtkDialog versiyonları için daha basit eşanlamlılar ve tutarlı bile değiller. En son kaptığınız versiyon 0.8.3, oldukça kararlı. (Moderatörler: Burada GtkDialog'a daha fazla gerek yok. İlgilenen herkesin yeni sorular göndermesi gerekir.)
DocSalvager

1
@Glutanimate yadBirkaç aydır kullanıyorum ve gücünden çok etkilendim. Buradaki cevabınız yine de, kendi ilerleme çubuğumdan çok önce çok parlak ve aydınlık. wgetİlerleme barkodunu kendi uygulamama uyarlamak için çok hızlı olacağım : askubuntu.com/questions/900319/… .
WinEunuuchs2Unix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.