
Ich schreibe mein eigenes Skript, um mehrere Elemente herunterzuladen (gleichzeitig, ein Element pro Befehl) wget
und brauche einen Fortschrittsbalken. Ich verwende derzeit zenity --progress
für meine Fortschrittsbalken, aber das Problem ist, dass beim Herunterladen mehrere Fortschrittsbalken erscheinen.
Ich möchte etwas Ähnliches wie den Dateiübertragungsdialog in Nautilus erreichen:
Kann mir irgendjemand sagen, mit welchem/welchen Programm(en) oder welcher/welchen Sprache(n) sich das erreichen lässt?
NOTIZ: Ich habe nur Grundkenntnisse in Shell-Skripting, sonst nicht viel.
Antwort1
Lösung mit YAD
Überblick
Zenity wurde schon lange nicht mehr aktualisiert. Glücklicherweise gibt es einen Fork namensYADmit vielen zusätzlichen Funktionen. Es ist noch nicht in den offiziellen Repositories angekommen, aber Sie können es von einem webupd8 PPA installieren:
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
Eine der zu YAD hinzugefügten Funktionen ist ein Dialog mit mehreren Fortschrittsbalken. Hier ist ein Auszug aus dem YAD-Handbuch zu mehreren Fortschrittsbalken:
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.
Ein sehr einfaches Skript mit mehreren Fortschrittsbalken könnte also so aussehen:
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
So würde das Ergebnis aussehen:
Wir können den Balken Beschreibungen hinzufügen mit #
:
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
Ergebnis:
Wenn wir dies in einem Wget-Download-Skript implementieren möchten, müssen wir zunächst einige Dinge tun:
- Finden Sie einen Weg, den Download-Fortschritt und andere interessante Daten aus der wget-Ausgabe zu extrahieren
- Finden Sie einen Weg, über mehrere Dateien zu iterieren
- einen Weg finden, alle Informationen, die wir haben, an einen einzigen Yad-Dialog weiterzugeben
Ich fand dieses Projekt ziemlich interessant, also habe ich mich hingesetzt und ein Skript geschrieben, das all das oben Genannte tun sollte.
yad_wget
Folgendes ist dabei herausgekommen:
#!/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
Und so sieht es aus:
Lesen Sie unbedingt alle Kommentare durch, um herauszufinden, wie das Skript funktioniert. Wenn Sie Fragen haben, zögern Sie bitte nicht, diese in den Kommentaren unten zu stellen.
Bearbeiten:
Ich habe Unterstützung für die Festlegung der maximalen Anzahl gleichzeitiger Downloads hinzugefügt. Zum Beispiel für MAXDLS="5"
: