¿Cómo mostrar solo la barra de progreso de wget?

81

Por ejemplo:

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

¿Cómo puedo hacer que se vea así?

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

Sé que curl puede hacer eso, sin embargo, necesito que wget haga ese trabajo.

Flan Alflani
fuente
1
No creo que esto sea posible sin escribir un script para analizar la salida de wget. wget -nves lo más cerca que va a estar, y en realidad no muestra una barra de progreso, solo un resumen de una línea cuando se completa la descarga.
cdhowie
3
wget --progress = bar: force: noscroll
Leo Gallucci
2
curlpuede descargar archivos y producir una barra de progreso simple:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn

Respuestas:

26

Puede utilizar el siguiente filtro:

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
}

Uso:

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

Esta función depende de una secuencia de 0x0d0x0a0x0d0x0a0x0denvío justo antes de que se inicie la barra de progreso. Este comportamiento puede depender de la implementación.

Dennis Williamson
fuente
Si no tiene al menos la versión 1.16 de wget, ¡esto es útil!
A-312
1
Para evitar errores con la codificación de caracteres, debe reemplazar %cpor %spara corregir esto:
A-312
@HorsSujet: Los que veo son de comillas simples izquierda y derecha de Unicode. Editaré mi respuesta para hacer el cambio. Gracias por el informe.
Dennis Williamson
También puede mejorar su código con la segunda función, es más legible: pastebin.com/Ek5Wf4XK
A-312
Estoy de acuerdo en que es útil en un guión completo, pero no creo que sea necesario para la respuesta.
Dennis Williamson
183

Utilizar:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q: Apaga wgetla salida

  • --show-progress: Fuerza wgetpara mostrar la barra de progreso sin importar cuál sea su nivel de verbosidad

Señor Bo
fuente
11
¿Para mí esto se nota wget: unrecognized option '--show-progress'? ¿Sabe si esto solo está presente en las versiones más recientes de wget?
Uli Köhler
10
@ UliKöhler la bandera solo existe desde 1.16
Whymarrh
12
Debe haber alguna diferencia entre las versiones, pero para que funcione como se anuncia, para la versión 1.19, también necesito agregar la siguiente opción:, --progress=bar:force:noscrolljunto con -qy --show-progress. Esto funciona muy bien para un Dockerfile dentro de una compilación.
YoYo
1
Como menciona @YoYo, ¡no olvides --progress=bar:force:noscrolldetener la generación de nuevas líneas!
Brent Faust
21

Úselo usando estas banderas:

wget  -q --show-progress --progress=bar:force 2>&1
Amir Khalili
fuente
Mejor de una sola línea. No entiendo por qué no es la respuesta elegida.
Salamandar
¿Qué hace force 2>&1? Simplemente wget -q --show-progress --progress=barparece ceder a la misma salida para mí.
MBT
Este es el ganador. Es un error en Stack Overflow que no es la respuesta principal.
mmla
@ MBT: "2> & 1" simplemente combina las salidas stderr (generalmente destinado a mensajes de error y de registro) y stdout (generalmente destinado a resultados reales). Supongo que no es necesario aquí, pero a menudo se usa cuando las personas quieren redirigir la salida completa de un proceso (resultados Y mensajes de error) al mismo objetivo
jov14
13

Puede utilizar la followopción de tail:

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

El +6es borrar las primeras 6 líneas. Puede ser diferente en su versión wgeto en su idioma.

--progress=bar:forceDebe usar, de lo contrario, wget cambia al dottipo.

La desventaja es que la actualización es menos frecuente que con wget (parece cada 2 segundos). La --sleep-intervalopción de tailparece ser solo para eso, pero no cambió nada para mí.

Metaxal
fuente
¿Sabes por qué cambia al tipo de punto? algún problema de tipo TERM? la fuerza funcionó para mí - ¡gracias!
Neil McGill
Use esto para mostrar la barra de progreso solo sin el nombre de archivo de destino con el valor de cola "8". wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun
13

La opción --show-progress, como han señalado otros, es la mejor opción, pero está disponible solo desde GNU wget 1.16 , consulte Cambios notables en wget 1.16 .

Para estar seguros, primero podemos verificar si --show-progresses compatible:

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

wget $_PROGRESS_OPT ...

Tal vez sea hora de considerar solo usar curl.

ryenus
fuente
4

Puede utilizar opciones estándar:

wget --progress=bar http://somesite.com/TheFile.jpeg
slva
fuente
No me refiero a otras distribuciones, pero esto definitivamente no es lo que OP pidió, al menos en Ubuntu. Es decir, todavía muestra otra información, pero el OP solicitó la "barra de progreso solamente" ...
Dee'Kej
2

Este es otro ejemplo, tal vez te ayude

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"
}

fuente
0

Aquí hay una solución que le mostrará un punto para cada archivo (o línea, para el caso). Es particularmente útil si está descargando con --recursive. Esto no detectará errores y puede estar ligeramente apagado si hay líneas adicionales, pero para el progreso general en muchos archivos es útil:

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

Esto no es literalmente una respuesta, pero este fragmento también podría ser útil para algunos que vengan aquí, por ejemplo, "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

Lo que fue crucial para mí es stdbuf(1).

Michael Shigorin
fuente
2
¿Puedes explicar qué hace esta larga fila? Si ya afirma que esto "no es literalmente una respuesta", ¿cómo se relaciona esa línea con la pregunta?
Nico Haase
Esto está relacionado a través de una dirección de búsqueda potencial, eso es lo que he dicho; la línea de comando ejecuta wget en la configuración regional "C" con argumentos para que muestre su progreso de una manera que sea adecuada para su procesamiento posterior (con el búfer de E / S desactivado) en la barra de progreso de zenity, lo que resulta en una especie de interfaz gráfica de usuario agradable para algunos descargar ayudante, por ejemplo.
Michael Shigorin
Agregue toda la explicación a la respuesta en sí, no a la sección de comentarios
Nico Haase
Aquellos que no pueden obtener toda la explicación de la línea de comando dada, realmente no la necesitan - copiarán y pegarán sin pensar mucho o simplemente se saltearán todo; y los que pueden, no me necesitan como intérprete. Es como commit diff y commit message: no es necesario reiterar el primero dentro del segundo, sino la causa y la intención. Por favor, no le pida a la gente que haga tonterías :-)
Michael Shigorin