32blogby Studio Mitsu

Guía completa de wget: descargas, procesamiento por lotes y automatización

Aprende wget desde lo básico hasta uso avanzado: descargas por lotes, reanudación de transferencias, espejado de sitios y scripting.

by omitsu13 min read
Contenido

wget es una herramienta CLI para descargar archivos por HTTP, HTTPS y FTP. Ejecuta wget URL para descargar un archivo, usa -c para reanudar transferencias interrumpidas, -i para descargas por lotes desde una lista de URLs, y --mirror para clonar sitios web completos.

Ya sea un solo archivo, un lote de cientos o espejar un sitio web completo, wget lo maneja desde la terminal. Sin necesidad de GUI. Funciona por SSH. Puede ejecutarse en segundo plano, reanudar descargas interrumpidas y ser automatizado mediante scripts.

Esta guía cubre todo, desde lo básico hasta casos de uso reales, con ejemplos listos para ejecutar.

¿Qué es wget?

wget es una utilidad de línea de comandos para descargar archivos a través de HTTP, HTTPS y FTP. Es parte del Proyecto GNU y viene preinstalado en prácticamente todas las distribuciones Linux, y está disponible en macOS vía Homebrew.

Características clave:

  • No interactivo: se ejecuta completamente desatendido, perfecto para scripts y tareas cron
  • Reanudable: continúa donde lo dejaste después de una descarga interrumpida
  • Recursivo: puede rastrear y descargar sitios web completos
  • Compatible con proxy: funciona a través de proxies HTTP
  • Ejecución en segundo plano: desconéctate de la terminal y la descarga continúa

Verificar la instalación

Comprueba que wget está instalado:

bash
wget --version

Si no lo tienes:

bash
# Debian / Ubuntu
sudo apt install wget

# CentOS / RHEL
sudo yum install wget

# Fedora
sudo dnf install wget

# macOS (Homebrew)
brew install wget

Uso básico

Descargar un solo archivo

bash
wget https://example.com/file.zip

El archivo se guarda en el directorio actual. Una barra de progreso muestra la velocidad de descarga, cantidad descargada y tiempo restante estimado.

Especificar el nombre de archivo o directorio de salida

bash
# Guardar con un nombre diferente
wget -O myfile.zip https://example.com/file.zip

# Guardar en un directorio específico
wget -P ~/downloads/ https://example.com/file.zip

# Directorio y nombre personalizados (usar ruta completa con -O)
wget -O ~/downloads/setup.zip https://example.com/file.zip

Ejecutar en segundo plano

Al descargar archivos grandes, desconéctate de la terminal para seguir trabajando:

bash
wget -b https://example.com/largefile.iso

La salida va a wget-log. Monitorea el progreso con:

bash
tail -f wget-log

Referencia de opciones comunes

OpciónQué hace
-O ARCHIVOGuardar como ARCHIVO
-P DIRECTORIOGuardar en el directorio DIRECTORIO
-bModo segundo plano
-cContinuar/reanudar descarga interrumpida
-qModo silencioso (sin salida)
--limit-rate=VELOCIDADLimitar velocidad (ej. --limit-rate=1m)
-rDescarga recursiva
-l PROFUNDIDADEstablecer profundidad de recursión
--no-check-certificateOmitir verificación SSL
-i ARCHIVODescargar URLs listadas en ARCHIVO
--user-agent=STRINGEstablecer User-Agent personalizado
--header=STRINGAñadir cabecera HTTP
-NSolo descargar si es más nuevo que la copia local
--tries=NNúmero de intentos de reintento
--timeout=SEGUNDOSEstablecer timeout de conexión

Casos de uso reales

Descarga por lotes desde una lista de URLs

Crea un archivo de texto con una URL por línea, luego pásalo a wget con -i:

bash
cat > urls.txt << EOF
https://releases.ubuntu.com/24.04.4/ubuntu-24.04.4-desktop-amd64.iso
https://example.com/data/january.csv
https://example.com/data/february.csv
https://example.com/data/march.csv
EOF

wget -i urls.txt -P ~/downloads/

Cada URL se descarga en secuencia. Combina con -b para ejecutar todo el lote en segundo plano.

Reanudar una descarga interrumpida

Si una descarga grande se corta por un problema de red, simplemente añade -c y vuelve a ejecutar el mismo comando:

bash
# Descarga original (interrumpida)
wget https://example.com/bigfile.iso

# Reanudar desde donde se detuvo
wget -c https://example.com/bigfile.iso

wget verifica el tamaño del archivo local y solicita solo los bytes restantes. Si no existe un archivo parcial, empieza de cero.

Limitar la velocidad de descarga

Evita saturar tu conexión o ser limitado por el servidor:

bash
# Limitar a 1 MB/s
wget --limit-rate=1m https://example.com/file.iso

# Limitar a 500 KB/s
wget --limit-rate=500k https://example.com/file.iso

Autenticar con usuario y contraseña

Para HTTP Basic Auth:

bash
wget --user=myusername --password=mypassword https://example.com/protected/file.zip

Las contraseñas en argumentos de comando terminan en el historial del shell. Si eso te preocupa, omite --password y wget te la pedirá interactivamente:

bash
wget --user=myusername https://example.com/protected/file.zip
# pregunta: Password for 'myusername'@example.com:

Para FTP:

bash
wget ftp://ftp.example.com/pub/file.tar.gz
wget --ftp-user=user --ftp-password=pass ftp://ftp.example.com/private/file.tar.gz

Espejar un sitio web completo

Descargar una copia completa de un sitio para visualización offline o archivado:

bash
wget --mirror \
     --convert-links \
     --adjust-extension \
     --page-requisites \
     --no-parent \
     https://example.com/

Qué hace cada flag:

  • --mirror (o -m): descarga recursiva + marcas de tiempo + profundidad infinita
  • --convert-links: reescribe enlaces para que funcionen offline (absolutos → relativos)
  • --adjust-extension: añade .html a páginas que lo necesiten
  • --page-requisites: descarga CSS, imágenes, JS — todo lo necesario para renderizar la página
  • --no-parent: no subir por encima de la ruta especificada

El sitio descargado estará en un directorio con el nombre del dominio.

Solo descargar si el archivo ha cambiado

Consulta una URL y solo descarga cuando la versión del servidor es más nueva que tu copia local:

bash
wget -N https://example.com/data.csv

Esto es genial para mantener archivos de datos locales sincronizados. Combínalo con cron para actualizaciones programadas:

bash
# crontab -e: ejecutar diariamente a las 3 AM
0 3 * * * wget -N -q -P /var/data/ https://example.com/data.csv

Establecer un User-Agent personalizado

Algunos servidores bloquean peticiones de wget. Imita un navegador:

bash
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" \
     https://example.com/file.zip

Añadir cabeceras HTTP personalizadas

Útil para APIs que requieren un token de autorización:

bash
wget --header="Authorization: Bearer YOUR_API_TOKEN" \
     --header="Accept: application/json" \
     https://api.example.com/export/data.json

wget vs curl: ¿cuál usar?

Tanto wget como curl descargan contenido de URLs, pero tienen diferentes fortalezas:

Caso de usowgetcurl
Descarga simple de archivosExcelenteBien
Recursivo / espejado de sitiosExcelenteNo soportado
Reanudar descargas interrumpidasExcelenteExcelente
Peticiones APILimitadoExcelente
Manejo de datos de respuestaLimitadoExcelente
Descarga en segundo planoIntegrado (-b)Necesita & disown
Lote desde lista de URLsIntegrado (-i)Necesita un script
Control de método HTTPLimitadoControl total

Regla general:

  • Descargar archivos → wget
  • Llamar APIs, inspeccionar respuestas, HTTP complejo → curl
  • Scripting con manejo flexible de salida → curl

Técnicas avanzadas

Verificar enlaces rotos con --spider

Verifica URLs sin descargar nada. Útil para comprobar enlaces rotos en sitios web.

bash
# Verificar una sola URL
wget --spider https://example.com/page.html
bash
# Verificación por lotes desde una lista de URLs
wget --spider -i urls.txt 2>&1 | grep -E "broken|200|404"
bash
# Verificar recursivamente un sitio entero (sin descargas)
wget --spider --recursive --no-directories --level=2 \
     https://example.com/ 2>&1 | grep -B1 "broken"

--spider envía solo peticiones HEAD, usando casi nada de ancho de banda. Útil en pipelines CI/CD para detectar automáticamente enlaces rotos en sitios de documentación.

Persistir configuración con wgetrc

Deja de escribir las mismas opciones cada vez guardando valores por defecto en ~/.wgetrc.

text
# ~/.wgetrc
# Preservar timestamps
timestamping = on

# Número de reintentos
tries = 3

# Timeout de conexión (segundos)
timeout = 30

# Límite de ancho de banda por defecto
limit_rate = 2m

# Archivo de log
logfile = /tmp/wget.log

# Respetar robots.txt
robots = on
bash
# La configuración de wgetrc se aplica automáticamente
wget https://example.com/file.zip

# Sobrescribir configuración temporalmente
wget --no-config https://example.com/file.zip
wget --limit-rate=0 https://example.com/file.zip

Usa --no-config para ignorar wgetrc completamente. Para configuraciones de equipo, usa /etc/wgetrc.

Registrar URLs rechazadas con --rejected-log

Al descargar muchos archivos, registra qué falló para revisión posterior.

bash
# Registrar URLs rechazadas
wget --recursive --level=1 \
     --rejected-log=rejected.log \
     https://example.com/downloads/

# Reintentar solo las URLs que fallaron
cat rejected.log | awk '{print $1}' | wget -i -

Descargar archivos grandes en segundo plano

bash
# -b ejecuta en segundo plano (el log va a wget-log)
wget -b https://example.com/large-file.iso

# Monitorear progreso
tail -f wget-log

# Especificar un archivo de log personalizado
wget -b -o download.log https://example.com/large-file.iso

Si necesitas que las descargas sobrevivan desconexiones SSH, combina con tmux o usa nohup.

bash
nohup wget https://example.com/large-file.iso &

Ejemplos de scripting

wget se combina naturalmente con scripts de shell. Aquí van algunos patrones prácticos.

Descargar múltiples versiones de un archivo

bash
#!/bin/bash

BASE_URL="https://example.com/releases"
VERSIONS=("1.0.0" "1.1.0" "1.2.0" "2.0.0")
DEST_DIR="./downloads"

mkdir -p "$DEST_DIR"

for VERSION in "${VERSIONS[@]}"; do
  FILE="myapp-${VERSION}.tar.gz"
  URL="${BASE_URL}/${VERSION}/${FILE}"

  echo "Descargando ${FILE}..."
  wget -q --show-progress -P "$DEST_DIR" "$URL"

  if [ $? -eq 0 ]; then
    echo "  OK: ${FILE}"
  else
    echo "  FALLÓ: ${FILE}"
  fi
done

echo "Hecho."

Descargar y verificar checksum

bash
#!/bin/bash

# Consulta la página oficial de releases de Ubuntu para la versión actual y el hash SHA256:
# https://releases.ubuntu.com/
URL="https://releases.ubuntu.com/24.04.4/ubuntu-24.04.4-desktop-amd64.iso"
EXPECTED_SHA256="<obtén el hash actual del sitio oficial de Ubuntu>"

echo "Descargando..."
wget -q --show-progress -O ubuntu.iso "$URL"

echo "Verificando checksum..."
# Linux: sha256sum / macOS: shasum -a 256
if command -v sha256sum &>/dev/null; then
  ACTUAL_SHA256=$(sha256sum ubuntu.iso | awk '{print $1}')
else
  ACTUAL_SHA256=$(shasum -a 256 ubuntu.iso | awk '{print $1}')
fi

if [ "$ACTUAL_SHA256" = "$EXPECTED_SHA256" ]; then
  echo "Checksum OK — el archivo es válido"
else
  echo "¡Checksum no coincide! El archivo puede estar corrupto."
  exit 1
fi

Solución de problemas

Errores de certificado SSL

bash
# Omitir verificación (bien para pruebas, evitar en producción)
wget --no-check-certificate https://example.com/file.zip

Timeouts de conexión o servidores inestables

bash
# Timeout de 30 segundos, reintentar hasta 5 veces con 10 segundos entre reintentos
wget --timeout=30 --tries=5 --waitretry=10 https://example.com/file.zip

# Reintentar indefinidamente (útil para descargas muy grandes con conexiones poco fiables)
wget --tries=0 https://example.com/file.zip

Verificar cadena de redirecciones sin descargar

Inspecciona las cabeceras y ve a dónde redirige una URL, sin descargar nada:

bash
wget --server-response --spider https://example.com/file.zip

La descarga se detiene en 0 bytes

A veces los servidores envían una respuesta pero sin datos. Intenta añadir un User-Agent o verifica si la URL requiere autenticación.

Consideraciones de seguridad

Al descargar archivos de fuentes externas, la seguridad importa.

Vulnerabilidad de wget2 (CVE-2025-69194): Se encontró una vulnerabilidad de alta severidad (CVSS 8.8) en el procesamiento de documentos Metalink de GNU Wget2. Al usar --force-metalink, un fallo de path traversal permite a atacantes remotos sobrescribir archivos locales. Si usas wget2, actualiza a 2.2.1 o posterior.

Mejores prácticas:

  • Nunca uses --no-check-certificate en producción — limítalo a pruebas con certificados autofirmados
  • Siempre verifica checksums para archivos descargados de fuentes no confiables (ver el ejemplo de script arriba)
  • La suplantación de User-Agent con --user-agent puede violar los términos de servicio de un sitio — verifica antes de hacer scraping
  • Al usar cron para descargas automatizadas, mantén logs y monitoréalos periódicamente

Artículos relacionados

Preguntas frecuentes

¿Cuándo usar wget en lugar de curl?

Usa wget para descargas simples de archivos, procesamiento por lotes con listas de URLs (-i), espejado recursivo de sitios y descargas en segundo plano. Usa curl cuando necesites control fino sobre métodos HTTP, manejo de respuestas o interacciones con APIs.

¿Cómo reanudo una descarga interrumpida con wget?

Ejecuta wget -c URL con la misma URL. wget verifica el tamaño del archivo local y solicita solo los bytes restantes al servidor. Esto requiere que el servidor soporte peticiones HTTP Range.

¿Cómo espejo un sitio web completo con wget?

Usa wget --mirror --convert-links --adjust-extension --page-requisites --no-parent URL. El flag --mirror habilita la descarga recursiva con profundidad infinita y verificación de timestamps, mientras que --convert-links reescribe las URLs para navegación offline.

¿Cuál es la diferencia entre wget2 y wget 1.x?

wget2 es la reescritura de nueva generación de GNU Wget. Añade soporte HTTP/2, descargas paralelas, multi-threading y mejor rendimiento. Sin embargo, no es totalmente compatible con scripts de wget 1.x, así que prueba antes de migrar.

¿Cómo uso wget a través de un proxy?

Establece las variables de entorno http_proxy y https_proxy, o añade las directivas http_proxy / https_proxy en ~/.wgetrc. Usa --no-proxy para ignorar temporalmente la configuración del proxy.

¿Cómo limito la velocidad de descarga de wget?

Usa --limit-rate=1m (1 MB/s) o --limit-rate=500k (500 KB/s). Para establecer un límite por defecto, añade limit_rate = 2m en tu archivo ~/.wgetrc.

¿Cuál es la diferencia entre wget -O y -P?

-O nombre especifica el nombre exacto del archivo de salida. -P directorio especifica el directorio de destino, y el nombre del archivo se deriva automáticamente de la URL.

Conclusión

wget es una de esas herramientas que usas a diario una vez que te sientes cómodo con ella. Lo básico se aprende en cinco minutos, y las funcionalidades avanzadas están ahí cuando las necesites. Para la referencia completa de opciones, consulta el manual oficial de GNU Wget.

Resumen rápido de las opciones más útiles:

  • Descarga básica: wget URL
  • Renombrar salida: wget -O nombre URL
  • Guardar en directorio: wget -P /ruta/ URL
  • Segundo plano: wget -b URL
  • Reanudar: wget -c URL
  • Lote desde lista: wget -i urls.txt
  • Espejar un sitio: wget --mirror --convert-links --page-requisites URL
  • Actualización condicional: wget -N URL

Empieza con lo básico, luego recurre a los flags avanzados según surjan necesidades específicas. Y cuando te encuentres descargando archivos repetidamente en un flujo de trabajo, considera envolver wget en un script de shell corto — se acumula bien.