Wie wird nur der Fortschrittsbalken angezeigt?


81

Zum Beispiel:

wget http://somesite.com/TheFile.jpeg

downloading: TheFile.tar.gz ...
--09:30:42--  http://somesite.com/TheFile.jpeg
           => `/home/me/Downloads/TheFile.jpeg'
Resolving somesite.co... xxx.xxx.xxx.xxx.
Connecting to somesite.co|xxx.xxx.xxx.xxx|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,614,820 (1.5M) [image/jpeg]

25% [======>                              ] 614,424      173.62K/s    ETA 00:14

Wie kann ich es so aussehen lassen?

downloading: TheFile.jpeg ...
25% [======>                              ] 614,424      173.62K/s    ETA 00:14

Ich weiß, dass Curl das kann, aber ich muss wget bekommen, um diesen Job zu machen.


1
Ich denke nicht, dass dies möglich ist, ohne ein Skript zu schreiben, um die Ausgabe von wget zu analysieren. wget -nvist ungefähr der nächste, den Sie erreichen werden, und es wird kein Fortschrittsbalken angezeigt, sondern nur eine einzeilige Zusammenfassung, wenn der Download abgeschlossen ist.
CDhowie

3
wget --progress = bar: force: noscroll
Leo Gallucci

2
curlkann Dateien herunterladen und einen einfachen Fortschrittsbalken erstellen:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn

Antworten:


26

Sie können den folgenden Filter verwenden:

progressfilt ()
{
    local flag=false c count cr=$'\r' nl=$'\n'
    while IFS='' read -d '' -rn 1 c
    do
        if $flag
        then
            printf '%s' "$c"
        else
            if [[ $c != $cr && $c != $nl ]]
            then
                count=0
            else
                ((count++))
                if ((count > 1))
                then
                    flag=true
                fi
            fi
        fi
    done
}

Verwendung:

$ wget --progress=bar:force http://somesite.com/TheFile.jpeg 2>&1 | progressfilt
100%[======================================>] 15,790      48.8K/s   in 0.3s

2011-01-13 22:09:59 (48.8 KB/s) - 'TheFile.jpeg' saved [15790/15790]

Diese Funktion hängt von einer Sequenz ab 0x0d0x0a0x0d0x0a0x0d, die unmittelbar vor dem Start des Fortschrittsbalkens gesendet wird. Dieses Verhalten kann implementierungsabhängig sein.


Wenn Sie nicht mindestens Version 1.16 von wget haben, ist dies nützlich!
A-312

1
Um Fehler mit char-Codierung zu vermeiden, müssen Sie ersetzen %cdurch %szu beheben diese:
A-312

@HorsSujet: Die, die ich sehe, stammen aus einfachen linken und rechten Anführungszeichen von Unicode. Ich werde meine Antwort bearbeiten, um die Änderung vorzunehmen. Danke für den Bericht.
Dennis Williamson

Sie können Ihren Code auch mit der 2. Funktion verbessern, die besser lesbar ist: pastebin.com/Ek5Wf4XK
A-312

Ich bin damit einverstanden, dass dies in einem vollständigen Skript nützlich ist, aber ich denke nicht, dass es für die Antwort notwendig ist.
Dennis Williamson

183

Verwenden:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q: Schalten Sie wgetden Ausgang aus

  • --show-progress: Erzwingen Sie wgetdie Anzeige des Fortschrittsbalkens, unabhängig davon, auf welche Ausführlichkeitsstufe eingestellt ist


11
Für mich zeigt das wget: unrecognized option '--show-progress'? Wissen Sie, ob dies nur in neueren Wget-Versionen vorhanden ist?
Uli Köhler


12
Es muss einen Unterschied zwischen den Versionen geben, aber damit es wie angekündigt funktioniert, muss ich für Version 1.19 auch die folgende Option hinzufügen: --progress=bar:force:noscrollzusammen mit -qund --show-progress. Dies funktioniert gut für eine Docker-Datei innerhalb eines Builds.
YoYo

1
Vergessen Sie nicht, wie @YoYo erwähnt, --progress=bar:force:noscrollzu verhindern, dass die Zeilenumbrüche generiert werden!
Brent Faust

21

Verwenden Sie diese Flags:

wget  -q --show-progress --progress=bar:force 2>&1

Bester Einzeiler. Ich verstehe nicht, warum es nicht die gewählte Antwort ist.
Salamandar

Was macht force 2>&1das Scheint wget -q --show-progress --progress=barmir nur die gleiche Leistung zu liefern.
MBT

Dieser ist der Gewinner. Es ist ein Fehler in Stack Overflow, dass dies nicht die beste Antwort ist.
mmla

@ MBT: "2> & 1" kombiniert einfach die Ausgaben stderr (normalerweise für Fehler- und Protokollmeldungen gedacht) und stdout (normalerweise für tatsächliche Ergebnisse gedacht). Vermutlich ist dies hier nicht erforderlich, wird jedoch häufig verwendet, wenn
Benutzer

13

Sie können die followOption verwenden tail:

wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +6

Das +6ist, um die ersten 6 Zeilen zu löschen. Dies kann in Ihrer Version wgetoder Ihrer Sprache unterschiedlich sein.

Sie müssen --progress=bar:forceansonsten wget-Schalter für den dotTyp verwenden.

Der Nachteil ist, dass die Aktualisierung weniger häufig ist als bei wget (sieht aus wie alle 2 Sekunden). Die --sleep-intervalOption von tailscheint nur dafür gedacht zu sein, aber es hat nichts für mich geändert.


Wissen Sie, warum es auf Punkttyp umschaltet? ein Problem mit dem Typ TERM? Kraft hat für mich gearbeitet - danke!
Neil McGill

Verwenden Sie diese Option, um den Fortschrittsbalken nur ohne Zieldateinamen mit dem Endwert "8" anzuzeigen. wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun

13

Die Option ist --show-progress, wie von anderen erwähnt, die beste Option, sie ist jedoch erst seit GNU wget 1.16 verfügbar , siehe Bemerkenswerte Änderungen in wget 1.16 .

Um sicher zu gehen, können wir zunächst prüfen, ob dies --show-progressunterstützt wird:

# set progress option accordingly
wget --help | grep -q '\--show-progress' && \
  _PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT=""

wget $_PROGRESS_OPT ...

Vielleicht ist es an der Zeit, nur darüber nachzudenken curl.


4

Sie können Standardoptionen verwenden:

wget --progress=bar http://somesite.com/TheFile.jpeg

Ich habe keine Ahnung von anderen Distributionen, aber das ist definitiv nicht das, wonach OP gefragt hat, zumindest unter Ubuntu. Das heißt, es werden noch andere Informationen
angezeigt

2

Dies ist ein weiteres Beispiel, das Ihnen vielleicht helfen wird

download() {
    local url=$1
    echo -n "    "
    wget --progress=dot $url 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk '{printf("\b\b\b\b%4s", $2)}'
    echo -ne "\b\b\b\b"
    echo " DONE"
}

0

Hier ist eine Lösung, die Ihnen einen Punkt für jede Datei (oder Zeile) anzeigt. Dies ist besonders nützlich, wenn Sie mit herunterladen --recursive. Dies fängt keine Fehler ab und kann geringfügig abweichen, wenn zusätzliche Zeilen vorhanden sind. Für den allgemeinen Fortschritt bei vielen Dateien ist dies jedoch hilfreich:

wget -r -nv https://example.com/files/ | \
    awk -v "ORS=" '{ print "."; fflush(); } END { print "\n" }'

-3

Dies ist keine wörtliche Antwort, aber dieses Snippet könnte auch für einige hilfreich sein, die hierher kommen, z. B. "zenity wget GUI":

LANG=C wget -O /dev/null --progress=bar:force:noscroll --limit-rate 5k http://nightly.altlinux.org/sisyphus/ChangeLog 2>&1 | stdbuf -i0 -o0 -e0 tr '>' '\n' | stdbuf -i0 -o0 -e0 sed -rn 's/^.*\<([0-9]+)%\[.*$/\1/p' | zenity --progress --auto-close

Was für mich entscheidend war, ist stdbuf(1).


2
Können Sie erklären, was diese lange Schlange macht? Wenn Sie bereits sagen, dass dies "keine wörtliche Antwort" ist, wie hängt diese Zeile mit der Frage zusammen?
Nico Haase

Dies hängt mit einer möglichen Suchrichtung zusammen, das habe ich angegeben. Die Befehlszeile führt wget im Gebietsschema "C" mit Argumenten aus, damit der Fortschritt auf eine Weise ausgegeben wird, die für die weitere Verarbeitung (bei deaktivierter E / A-Pufferung) in der Fortschrittsanzeige von zenity geeignet ist. Dies führt für einige zu einer Art netter GUI Download-Helfer zum Beispiel.
Michael Shigorin

Bitte fügen Sie alle Erklärungen zur Antwort selbst hinzu, nicht zum Kommentarbereich
Nico Haase

Diejenigen, die nicht alle Erklärungen über die angegebene Befehlszeile erhalten können, brauchen sie nicht wirklich - sie werden entweder kopieren und einfügen, ohne viel nachzudenken, oder einfach alles überspringen. und diejenigen, die können, brauchen mich nicht als Dolmetscher. Es ist wie Commit Diff und Commit Message: Keine Notwendigkeit, das erstere innerhalb des letzteren zu wiederholen, sondern die Ursache und Absicht. Bitte bitte die Leute nicht, dumme Sachen zu machen :-)
Michael Shigorin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.