Как показать только индикатор выполнения 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отправки непосредственно перед запуском индикатора выполнения. Такое поведение может зависеть от реализации.

Деннис Уильямсон
источник
Если у вас нет wget как минимум версии 1.16, это полезно!
A-312
1
Чтобы предотвратить ошибку с кодировкой символов, вы должны заменить %cна, %sчтобы исправить это:
A-312,
@HorsSujet: Я вижу те, которые взяты из левых и правых одинарных кавычек Unicode. Я отредактирую свой ответ, чтобы внести изменения. Спасибо за отчет.
Деннис Уильямсон
Вы также можете улучшить свой код с помощью 2-й функции, она более читабельна: pastebin.com/Ek5Wf4XK
A-312,
Я согласен, что это полезно в полном сценарии, но я не думаю, что это необходимо для ответа.
Деннис Уильямсон
184

Использование:

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. Это хорошо работает для Dockerfile в сборке.
YoYo
1
Как упоминает @YoYo, не забудьте запретить создание новых --progress=bar:force:noscrollстрок!
Brent Faust
21

Используйте эти флаги:

wget  -q --show-progress --progress=bar:force 2>&1
Амир Халили
источник
Лучший однострочный. Я не понимаю, почему это не выбранный ответ.
Salamandar
Что force 2>&1делать? Просто wget -q --show-progress --progress=barкажется, что для меня результат такой же.
MBT
Это победитель. Ошибка в Stack Overflow, что это не главный ответ.
mmla 04
@ 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кажется, имел в виду только для этого, но это ничего не изменило для меня.

Метаксал
источник
вы знаете, почему он переключается на точечный? какая-то проблема типа TERM? у меня сила сработала - спасибо!
Нил МакГилл
Используйте это для отображения индикатора выполнения только без имени файла с конечным значением «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.

ryenus
источник
4

Можно использовать стандартные варианты:

wget --progress=bar http://somesite.com/TheFile.jpeg
слва
источник
Я не говорю о некоторых других дистрибутивах, но это определенно не то, о чем просил OP, по крайней мере, на Ubuntu. То есть, он по-прежнему показывает другую информацию, но OP запросил «только индикатор выполнения» ...
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 - в результате получается своего рода красивый графический интерфейс для некоторых скачать помощник, например.
Михаил Шигорин
Пожалуйста, добавляйте все объяснения к самому ответу, а не в раздел комментариев
Нико Хаасе
Тем, кто не может получить все объяснения из данной командной строки, она на самом деле не нужна - они либо скопируют, не задумываясь, либо просто все пропустят; а тем, кто может, я не нужен как переводчик. Это похоже на фиксацию diff и фиксацию сообщения: не нужно повторять первое во втором, а скорее причину и намерение. Пожалуйста, не просите людей делать глупости :-)
Михаил Шигорин