Jak wyświetlić tylko pasek postępu wget?


81

Na przykład:

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

Jak mogę sprawić, żeby wyglądało to tak

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

Wiem, że Curl może to zrobić, ale muszę zmusić Wget do wykonania tej pracy.


1
Nie sądzę, aby było to możliwe bez napisania skryptu analizującego wyjście wget. wget -nvjest najbliższym, jaki masz zamiar uzyskać, i tak naprawdę nie wyświetla paska postępu, a tylko jednowierszowe podsumowanie po zakończeniu pobierania.
cdhowie

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

2
curlmoże pobierać pliki i tworzyć prosty pasek postępu:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn

Odpowiedzi:


26

Możesz użyć następującego filtra:

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
}

Stosowanie:

$ 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]

Ta funkcja zależy od kolejności 0x0d0x0a0x0d0x0a0x0dwysyłania tuż przed uruchomieniem paska postępu. To zachowanie może zależeć od implementacji.


Jeśli nie masz co najmniej wersji 1.16 wget, jest to przydatne!
A-312

1
Aby zapobiec błędom w kodowaniu znaków, musisz zamienić %cje na, %saby to naprawić:
A-312

@HorsSujet: Te, które widzę, pochodzą z lewego i prawego pojedynczego cudzysłowu Unicode. Zmienię odpowiedź, aby wprowadzić zmianę. Dzięki za raport.
Dennis Williamson

Możesz także ulepszyć swój kod za pomocą drugiej funkcji, jest bardziej czytelny: pastebin.com/Ek5Wf4XK
A-312

Zgadzam się, że jest to przydatne w pełnym scenariuszu, ale nie sądzę, aby było to konieczne do udzielenia odpowiedzi.
Dennis Williamson

184

Posługiwać się:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q: Wyłącz wgetwyjście

  • --show-progress: Wymusza wgetwyświetlanie paska postępu bez względu na ustawiony poziom szczegółowości


11
Dla mnie to pokazuje wget: unrecognized option '--show-progress'? Czy wiesz, czy jest to obecne tylko w nowszych wersjach wget?
Uli Köhler


12
Musi być jakaś różnica między wersjami, ale aby działała zgodnie z reklamą, dla wersji 1.19 muszę również dodać następującą opcję: --progress=bar:force:noscrollwraz z -qi --show-progress. Działa to dobrze w przypadku pliku Dockerfile w kompilacji.
YoYo,

1
Jak wspomina @YoYo, nie zapomnij --progress=bar:force:noscrollzatrzymać generowania nowych linii!
Brent Faust,

21

Użyj używając tych flag:

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

Najlepsza jednolinijka. Nie rozumiem, dlaczego nie jest to wybrana odpowiedź.
Salamandar

Co robi force 2>&1? wget -q --show-progress --progress=barWydaje mi się, że po prostu ustępuje tej samej produkcji.
MBT

Ten jest zwycięzcą. To błąd w przepełnieniu stosu, że nie jest to najlepsza odpowiedź.
mmla

@ MBT: "2> & 1" po prostu łączy wyjścia stderr (zwykle przeznaczone do komunikatów o błędach i dziennikach) i stdout (zwykle przeznaczone do rzeczywistych wyników). Chyba jest to niepotrzebne, ale często jest używane, gdy ludzie chcą przekierować pełne dane wyjściowe procesu (wyniki ORAZ komunikaty o błędach) do tego samego celu
jov14

13

Możesz skorzystać z followopcji tail:

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

Służy +6do usunięcia pierwszych 6 wierszy. Może się różnić w Twojej wersji wgetlub języku.

W --progress=bar:forceprzeciwnym razie wget przełącza się na dottyp.

Wadą jest to, że odświeżanie jest rzadsze niż w przypadku wget (wygląda jak co 2 sekundy). --sleep-intervalOpcja tailwydaje się być przeznaczona tylko dla tego, ale to nic nie zmienia dla mnie.


czy wiesz, dlaczego przełącza się na typ kropkowy? jakiś problem typu TERM? siła działała na mnie - dzięki!
Neil McGill

Użyj tego do wyświetlania paska postępu tylko bez nazwy pliku docelowego z wartością końcową „8”. wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun

13

Opcja --show-progress, jak wskazali inni, jest najlepszą opcją, ale jest dostępna tylko od wersji GNU wget 1.16 , zobacz Godne uwagi zmiany w wget 1.16 .

Dla bezpieczeństwa możemy najpierw sprawdzić, czy --show-progressjest obsługiwany:

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

wget $_PROGRESS_OPT ...

Może nadszedł czas, aby rozważyć użycie curl.


4

Możesz użyć standardowych opcji:

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

Nie mówię o innych dystrybucjach, ale zdecydowanie nie o to prosił OP, przynajmniej na Ubuntu. To znaczy, nadal pokazuje inne informacje, ale OP poprosił o "tylko pasek postępu" ...
Dee'Kej

2

To kolejny przykład, może ci pomoże

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

Oto rozwiązanie, które pokaże kropkę dla każdego pliku (lub linii, jeśli o to chodzi). Jest to szczególnie przydatne, jeśli pobierasz z --recursive. Nie wykryje to błędów i może być nieco wyłączone, jeśli są dodatkowe wiersze, ale w przypadku ogólnego postępu w wielu plikach jest pomocne:

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

-3

To nie jest dosłowna odpowiedź, ale ten fragment może być również pomocny dla osób, które tu przyjeżdżają, np. „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

To, co było dla mnie kluczowe, to stdbuf(1).


2
Czy możesz wyjaśnić, co robi ta długa kolejka? Jeśli już stwierdzisz, że to „nie jest dosłownie odpowiedź”, jaki jest związek tego wiersza z pytaniem?
Nico Haase,

Jest to związane z potencjalnym kierunkiem wyszukiwania, oto co powiedziałem; linia poleceń uruchamia wget w ustawieniach regionalnych "C" z argumentami, które powodują, że wyświetla postęp w sposób odpowiedni do dalszego przetwarzania (z wyłączonym buforowaniem I / O) na pasku postępu zenity - co skutkuje dla niektórych przyjemnym GUI na przykład pomocnik pobierania.
Michael Shigorin

Prosimy o dodanie wszystkich wyjaśnień do samej odpowiedzi, a nie do sekcji komentarzy
Nico Haase

Ci, którzy nie mogą uzyskać wszystkich wyjaśnień z podanego wiersza poleceń, tak naprawdę ich nie potrzebują - albo kopiują i wklejają bez zastanowienia się, albo po prostu je pomijają; a ci, którzy mogą, nie potrzebują mnie jako tłumacza. To jest jak zatwierdzenie różnicy i zatwierdzenie wiadomości: nie ma potrzeby powtarzania pierwszego w drugim, a raczej przyczynę i zamiar. Proszę, nie proś ludzi o robienie
głupstw
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.