Saltar al contenido principal

Clase 04 — Descargas y Transferencias de Archivos

Descargar archivos

# Guardar con nombre personalizado (-o)
curl -o mi-archivo.json https://httpbin.org/get

# Guardar con nombre original (-O)
curl -O https://releases.ubuntu.com/22.04/SHA256SUMS

# Barra de progreso simplificada
curl -# -o ubuntu.iso https://ejemplo.com/ubuntu.iso

# Silencioso
curl -s -o ubuntu.iso https://ejemplo.com/ubuntu.iso

Reanudar descargas

# Reanudar descarga interrumpida
curl -C - -O https://ejemplo.com/archivo-grande.zip

# Script con reintentos
for intento in {1..5}; do
echo "Intento $intento..."
if curl -C - -o "$ARCHIVO" "$URL"; then
echo "✅ Descarga completada"
break
fi
sleep 5
done

Seguir redirecciones (-L)

curl -L https://github.com/roxsross

# Limitar redirecciones
curl -L --max-redirs 3 https://httpbin.org/redirect/5

# Ver las redirecciones
curl -sIL https://httpbin.org/redirect/3 2>&1 | grep -i "location\|HTTP"

Limitar velocidad y timeouts

# Limitar velocidad de descarga
curl --limit-rate 1M -O https://ejemplo.com/archivo.zip

# Timeouts (recomendado en scripts)
curl --connect-timeout 5 --max-time 30 https://api.ejemplo.com/datos

# Reintentos automáticos
curl --retry 3 --retry-delay 2 --retry-all-errors https://api.ejemplo.com/datos

Verificar antes de descargar

# Ver tamaño sin descargar (HEAD)
curl -sI https://ejemplo.com/archivo | grep -i content-length

# Verificar tipo de archivo
curl -sI https://ejemplo.com/archivo | grep -i content-type

# Verificar si soporta reanudación
curl -sI https://ejemplo.com/archivo | grep -i accept-ranges

Descargar múltiples archivos

# Desde un archivo de URLs
xargs -n1 curl -O < urls.txt

# Con paralelismo
cat urls.txt | xargs -P 4 -n1 curl -sO

# Rango de URLs
curl -O "https://ejemplo.com/img/foto_[001-100].jpg"

Ejemplo: Descargar herramientas DevOps

#!/bin/bash
DESTINO="${HOME}/.local/bin"
mkdir -p "$DESTINO"
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m)"
[[ "$ARCH" == "x86_64" ]] && ARCH="amd64"
[[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]] && ARCH="arm64"

# kubectl
KUBECTL_VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)
curl -sL -o "$DESTINO/kubectl" \
"https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${OS}/${ARCH}/kubectl"
chmod +x "$DESTINO/kubectl"
echo "✅ kubectl $KUBECTL_VERSION"

Ejemplo: Descarga con verificación de checksum

#!/bin/bash
URL="https://ejemplo.com/release/app-2.0.tar.gz"
CHECKSUM_URL="${URL}.sha256"
ARCHIVO="app-2.0.tar.gz"

curl -sL -o "$ARCHIVO" "$URL"
EXPECTED=$(curl -sL "$CHECKSUM_URL" | awk '{print $1}')
ACTUAL=$(shasum -a 256 "$ARCHIVO" | awk '{print $1}')

if [[ "$EXPECTED" == "$ACTUAL" ]]; then
echo "✅ Checksum OK"
else
echo "❌ Checksum NO coincide!"
rm -f "$ARCHIVO"
exit 1
fi

Ejercicios

  1. Descargá un archivo grande y practicá reanudar la descarga con -C -
  2. Creá un script que descargue 5 archivos en paralelo usando xargs
  3. Usá curl -I para verificar el tamaño y tipo de 3 archivos antes de descargarlos
  4. Implementá un script de descarga con reintentos y verificación de checksum