Як показати лише панель прогресу wget?


81

Наприклад:

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

Як я можу змусити це виглядати так

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

Я знаю, що curl може це зробити, однак мені потрібно отримати wget, щоб виконати цю роботу.


1
Я не думаю, що це можливо без написання сценарію для аналізу вихідних даних wget. wget -nvце приблизно найближче, яке ви збираєтеся отримати, і насправді воно не відображає індикатор прогресу, а лише підсумок у один рядок після завершення завантаження.
cdhowie

3
wget --progress = bar: force: noscroll
Лео

2
curlможе завантажувати файли та створювати просту смугу прогресу:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn

Відповіді:


26

Ви можете використовувати такий фільтр:

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
}

Використання:

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

Ця функція залежить від послідовності 0x0d0x0a0x0d0x0a0x0dнадсилання безпосередньо перед запуском індикатора виконання. Ця поведінка може залежати від реалізації.


Якщо у вас немає хоча б версії 1.16 wget, це корисно!
A-312,

1
Щоб запобігти помилці з кодуванням символів, вам доведеться замінити %cна, %sщоб виправити це:
A-312

@HorsSujet: Я бачу їх з лівих та правих одинарних лапок Unicode. Я відредагую свою відповідь, щоб внести зміни. Дякую за звіт.
Денніс Вільямсон

Ви також можете вдосконалити свій код за допомогою 2-ї функції, вона читається більше: pastebin.com/Ek5Wf4XK
A-312

Я погоджуюсь, що це корисно в повному сценарії, але я не думаю, що це потрібно для відповіді.
Денніс Вільямсон

183

Використання:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q: Вимкнути wgetвихід

  • --show-progress: Примусово wgetвідображати індикатор прогресу незалежно від того, який рівень його деталізації встановлений


11
Для мене це видно wget: unrecognized option '--show-progress'? Чи знаєте ви, чи це є лише в нових версіях wget?
Улі Келер


12
У версіях повинна бути якась різниця, але щоб вона працювала так, як рекламується, для версії 1.19 мені також потрібно додати наступну опцію: --progress=bar:force:noscrollразом із -qі --show-progress. Це чудово працює для файлу Docker в рамках збірки.
YoYo

1
Як згадує @YoYo, не забувайте, --progress=bar:force:noscrollщоб зупинити створення нових рядків!
Брент Фауст,

21

Використовуйте, використовуючи ці прапори:

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

Кращий однокласник. Я не розумію, чому це не обрана відповідь.
Саламандар

Що робить force 2>&1? Просто , wget -q --show-progress --progress=barздається, вихід до того ж вихід для мене.
MBT

Цей є переможцем. Це помилка в Stack Overflow, що це не головна відповідь.
mmla

@ MBT: "2> & 1" просто поєднує результати stderr (зазвичай призначені для повідомлень про помилки та журнали) та stdout (зазвичай призначені для фактичних результатів). Думаю, тут це непотрібно, але часто воно використовується, коли люди хочуть перенаправити повний результат процесу (результати І повідомлення про помилки) на ту саму мету
jov14,

13

Ви можете скористатися followопцією tail:

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

Це +6видалення перших 6 рядків. Це може відрізнятися від вашої версії wgetабо вашої мови.

Вам потрібно використовувати --progress=bar:forceперемикач wget на інший dotтип.

Недоліком є ​​те, що оновлення відбувається рідше, ніж у wget (схоже на кожні 2 секунди). Можливо, --sleep-intervalваріант tailпризначений саме для цього, але для мене це нічого не змінило.


ви знаєте, чому він переходить на крапковий тип? якась проблема типу ТЕРМІН? сила спрацювала на мене - спасибі!
Ніл Макгілл,

Використовуйте це для відображення рядка прогресу лише без цільового імені файлу зі значенням хвоста "8". wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun

13

Варіант --show-progress, як вказували інші, є найкращим варіантом, але він доступний лише з GNU wget 1.16 , див. Заслуговують на увагу зміни у wget 1.16 .

Для безпеки ми спочатку можемо перевірити, чи --show-progressпідтримується:

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

wget $_PROGRESS_OPT ...

Можливо, пора подумати про те, щоб просто використовувати curl.


4

Ви можете використовувати стандартні параметри:

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

Я не про деякі інші дистрибутиви, але це точно не те, про що просив OP, принаймні в Ubuntu. Тобто, вона все ще показує іншу інформацію, але ОП просив "лише індикатор прогресу" ...
Dee'Kej

2

Це ще один приклад, можливо, допоможе вам

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

Ось рішення, яке покаже вам крапку для кожного файлу (або рядка). Це особливо корисно, якщо ви завантажуєте за допомогою --recursive. Це не призведе до помилок і може бути трохи вимкнено, якщо є зайві рядки, але для загального прогресу у багатьох файлах корисно:

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

-3

Це буквально не відповідь, але цей фрагмент також може бути корисним для тих, хто приходить сюди, наприклад, для "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

Що для мене було вирішальним stdbuf(1).


2
Ви можете пояснити, що робить ця довга черга? Якщо ви вже заявили, що це "не буквальна відповідь", як цей рядок пов'язаний із запитанням?
Ніко Хаасе

Це пов’язано з потенційним напрямком пошуку, ось що я сказав; командний рядок запускає wget у локалі "C" з аргументами, щоб змусити його виводити свій прогрес способом, придатним для подальшої обробки (з вимкненою буферизацією вводу-виводу) в панель прогресу zenity - що призводить до певного приємного графічного інтерфейсу для деяких наприклад, помічник завантаження.
Майкл

Будь ласка, додайте всі пояснення до самої відповіді, а не до розділу коментарів
Ніко Хаасе,

Тим, хто не може отримати все пояснення з наведеного командного рядка, воно насправді не потрібне - вони або скопіюють-вставлять, не довго думаючи, або просто пропустять все; а тим, хто може, я не потрібен як перекладач. Це схоже на повідомлення commit diff і commit: не потрібно повторювати перше всередині останнього, а причина та намір. Будь ласка, не просіть людей робити дурні вчинки :-)
Майкл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.