CLI AI

Reanudar una descarga interrumpida con curl sin corromperla

2026-06-29

La comprobación directa es curl -sI https://example.com/big.iso | grep -i 'accept-ranges': si no aparece Accept-Ranges: bytes en la respuesta, el servidor no puede reanudar nada y -C - no te va a salvar. Sáltate esa comprobación y puedes toparte con el fallo más feo de curl: termina con código 0, no imprime nada alarmante, y te deja un archivo truncado en silencio. Esto repasa cómo reanudar bien, detectar ese fallo, reintentar y confirmar que el resultado está realmente completo.

1. ¿El servidor puede reanudar descargas?

clai
$ clai comprueba si el servidor soporta reanudar descargas→ curl -sI https://example.com/big.iso | grep -i 'accept-ranges'

Si no aparece la cabecera Accept-Ranges: bytes, reanudar es imposible en principio, y -C - no va a cambiar eso. Treinta segundos de comprobación ahorran una hora de dolor cuando una descarga grande se corta cerca del final.

2. Reanudar una descarga normal

clai
$ clai reanuda esta descarga interrumpida→ curl -C - -O https://example.com/big.iso

-C - le dice a curl que calcule el offset por sí mismo a partir del tamaño del archivo local. -O lo guarda con el nombre de la URL. Si el archivo ya está completo, curl simplemente dice que no queda nada por descargar.

3. La trampa: el servidor no soporta Range

clai
$ clai descarga el archivo y comprueba que llegó completo→ curl -C - -o part.bin http://example.com/big.bin && cmp -s part.bin original.bin && echo intact || echo TRUNCATED

Esta es la línea por la que existe todo el artículo. Cuando un servidor ignora Range, curl igual termina con código 0 — sin error, sin aviso — y el archivo se queda cortado justo donde se detuvo. Probado contra un servidor real: llegaron 51200 bytes en lugar de 200000, sin un solo mensaje de error en ningún sitio. Nunca confíes en una descarga reanudada sin comprobarla — por tamaño, por cmp o por checksum.

4. Reintentar hasta que termine

clai
$ clai descarga este archivo con reintentos hasta que termine completo→ curl --retry 10 --retry-delay 5 --retry-all-errors -C - -O https://example.com/big.iso

--retry cubre los fallos de red, --retry-all-errors extiende eso también a las respuestas 5xx. Combinado con -C -, cada reintento continúa desde donde se quedó el anterior en lugar de empezar de cero.

5. Limitar la velocidad para no saturar el enlace

clai
$ clai descarga el archivo pero limítalo a un megabyte por segundo→ curl --limit-rate 1M -C - -O https://example.com/big.iso

Útil en una máquina donde algo más necesita ese ancho de banda. Acepta sufijos k, M y G.

6. Comprobar que descargaste el archivo correcto

clai
$ clai comprueba el checksum del archivo que acabas de descargar→ curl -sO https://example.com/big.iso.sha256 && sha256sum -c big.iso.sha256

El último paso de cualquier descarga reanudada. Un checksum que coincide es la única prueba real de que un archivo pegado a partir de trozos está íntegro — el tamaño puede coincidir aunque el contenido no.

Trampas

  • curl nunca avisa de que una reanudación falló. Código de salida 0, archivo truncado. Comprobarlo después es la única defensa real.
  • Si el archivo cambió en el servidor a mitad de la reanudación, obtienes basura. Bytes de la versión vieja y de la nueva acaban pegados en un solo archivo. Ante la duda, borra el archivo parcial y empieza de cero.
  • -C - junto a un -o que apunta a un archivo sobrante es peligroso. curl reanuda lo que ya haya en esa ruta — solo mira el nombre del archivo, no de dónde vinieron los bytes.

Preguntas relacionadas

¿wget o curl? wget -c tiene la misma lógica de reanudación y es más simple para un solo archivo. curl es más flexible en scripts y aparece en máquinas donde wget nunca se instaló.

¿Cómo reanudo una descarga por ssh? rsync --partial --progress --append-verify — reanuda y verifica la parte que ya tienes.

¿Qué significa "bad download resume"? curl no pudo continuar desde el offset correcto — el servidor no soporta Range, o el archivo cambió por debajo. Empieza de cero.

Ver también

Deja de adivinar qué flags de curl necesita una descarga reanudada: descríbela y CliAI escribe el comando. Instálalo en una línea.