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 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 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 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 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 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 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-oque 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
- Medir la latencia de una API con curl
- Comprobar si un puerto está abierto en un servidor remoto
- Extraer cualquier archivo comprimido
Deja de adivinar qué flags de curl necesita una descarga reanudada: descríbela y CliAI escribe el comando. Instálalo en una línea.