Come scaricare file con curl

curl è uno degli strumenti da riga di comando più versatili per scaricare file tramite HTTP, HTTPS, FTP e decine di altri protocolli. Che tu debba salvare una singola risposta API su file o automatizzare download batch in uno script shell, curl ha un flag per questo. Questa guida copre ogni opzione relativa al download — dal salvataggio base con -o e -O alla ripresa dei trasferimenti interrotti con -C -, alla limitazione della banda con --limit-rate e alla visualizzazione delle barre di avanzamento. Ogni flag include una spiegazione chiara, pattern di utilizzo comuni e un esempio pronto da copiare.

Riferimento rapido dei flag di download

-o

Scrivi l'output su un file con nome specificato invece di stdout

-O

Scrivi l'output su un file con il nome del file remoto

-L

Segui automaticamente i redirect HTTP 3xx

-C -

Continua/riprendi un trasferimento file precedente

--limit-rate

Limita la velocità di trasferimento al valore specificato

--max-filesize

Rifiuta di scaricare file più grandi della dimensione specificata

-J

Usa l'header Content-Disposition per nominare il file

-#

Visualizza il progresso del trasferimento come una semplice barra

-u

Fornisci username:password per l'autenticazione del server

--retry

Riprova il trasferimento in caso di errori temporanei (numero di tentativi)

--retry-delay

Attendi questo numero di secondi tra i tentativi

-T

Carica un file locale su un URL (PUT per default)

--create-dirs

Crea le directory locali necessarie quando salvi l'output

-s

Sopprimi il meter di progresso e i messaggi di errore

--output-dir

Salva i file di output nella directory specificata (curl 7.73+)

curl -o: Salva con un nome file specifico

Cosa fa
Il flag -o (o --output) indica a curl di salvare il corpo della risposta nel file specificato. Senza di esso, curl stampa la risposta su stdout (il terminale). Puoi usare qualsiasi nome file e percorso — curl creerà il file o sovrascriverà quello esistente.
Uso comune
Usa -o quando devi controllare il nome file esatto o salvare in una directory specifica. Funziona con qualsiasi protocollo — HTTP, HTTPS, FTP, SFTP e altri. Combinalo con -L per gestire i redirect e -s per operazioni silenziose negli script.
$ curl -o report.pdf https://example.com/files/report.pdf

curl -O: Salva con il nome file remoto

Cosa fa
Il flag -O (o --remote-name) salva il file scaricato usando il nome file estratto dall'URL. Ad esempio, se l'URL termina con /data.csv, curl crea un file chiamato data.csv nella directory corrente.
Uso comune
Usa -O quando il nome file remoto è significativo e non hai bisogno di rinominarlo. Puoi passare più flag -O per scaricare diversi file in un singolo comando. Nota: se l'URL non contiene un nome file (es. termina con /), curl fallirà — usa -o in alternativa.
$ curl -O https://example.com/files/data.csv

curl -L: Segui i redirect

Cosa fa
Il flag -L (o --location) fa sì che curl segua automaticamente i redirect HTTP — 301 (Moved Permanently), 302 (Found), 307 e 308. Senza -L, curl restituisce la risposta di redirect stessa invece del contenuto effettivo.
Uso comune
La maggior parte degli URL di download esegue almeno un redirect (es. da HTTP a HTTPS, o da un URL breve al file effettivo). Combina sempre -L con -o o -O quando scarichi file. Per default curl segue fino a 50 redirect; modifica questo con --max-redirs.
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gz

curl -C -: Riprendi download interrotti

Cosa fa
Il flag -C - (o --continue-at -) indica a curl di rilevare automaticamente la dimensione del file parziale esistente e riprendere il download da dove si era interrotto. Il server deve supportare l'header HTTP Range perché funzioni.
Uso comune
Se un download grande è stato interrotto da un problema di rete o timeout, riesegui semplicemente lo stesso comando aggiungendo -C -. curl invierà un header Range: bytes=OFFSET- e scaricherà solo i dati rimanenti. Questo è essenziale per file grandi su connessioni inaffidabili.
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: Limita la velocità di download

Cosa fa
Il flag --limit-rate limita la velocità di download (e upload) al valore specificato. Accetta suffissi: k o K per kilobyte/s, m o M per megabyte/s, g o G per gigabyte/s.
Uso comune
Usa --limit-rate per evitare di saturare la banda quando scarichi file grandi, specialmente su connessioni condivise. È utile anche per testare come la tua applicazione gestisce risposte lente.
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: Annulla se il file è troppo grande

Cosa fa
Il flag --max-filesize indica a curl di annullare il trasferimento se la dimensione attesa del file (dall'header Content-Length) supera il limite specificato. La dimensione può usare suffissi come k, M, G.
Uso comune
Usalo negli script per impedire che download inaspettatamente grandi consumino spazio su disco. Nota: non tutti i server inviano Content-Length — in quel caso, curl non può applicare questo limite e il download procede normalmente.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: Usa il nome file suggerito dal server

Cosa fa
Il flag -J (o --remote-header-name) indica a curl di usare il nome file specificato nell'header Content-Disposition del server invece di derivarlo dall'URL. Questo è comune per le API di download che restituiscono file con nomi significativi.
Uso comune
Combina sempre -J con -O. Questo è utile quando l'URL è un endpoint API (come /export?format=csv) ma il server restituisce un nome file appropriato negli header. Nota di sicurezza: il server controlla il nome file, quindi usalo solo con server affidabili.
$ curl -L -O -J https://example.com/api/export?format=csv

curl -#: Mostra una barra di avanzamento

Cosa fa
Il flag -# (o --progress-bar) sostituisce il meter di progresso verbose predefinito con una semplice barra di avanzamento ###. Questo è più facile da leggere per l'uso interattivo.
Uso comune
Usa -# quando scarichi in modo interattivo e vuoi un indicatore di progresso pulito. Per gli script, preferisci -s (silenzioso) o il meter di progresso predefinito. L'output predefinito di curl mostra già velocità, percentuale, tempo rimanente e dimensione totale.
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

Opzioni di download aggiuntive

-u

Fornisci username:password per l'autenticazione del server

--retry

Riprova il trasferimento in caso di errori temporanei (numero di tentativi)

--retry-delay

Attendi questo numero di secondi tra i tentativi

-T

Carica un file locale su un URL (PUT per default)

--create-dirs

Crea le directory locali necessarie quando salvi l'output

-s

Sopprimi il meter di progresso e i messaggi di errore

--output-dir

Salva i file di output nella directory specificata (curl 7.73+)

Scenari di download reali

Questi esempi combinano più flag per gestire le attività di download comuni che incontrerai nello sviluppo quotidiano e nello scripting.

Scarica più file contemporaneamente

Usa più flag -O per scaricare diversi file in un singolo comando. curl li elabora sequenzialmente. Per download paralleli, usa xargs o GNU parallel.

$ curl -O https://example.com/file1.txt -O https://example.com/file2.txt -O https://example.com/file3.txt

Download da un server FTP

curl supporta nativamente FTP, FTPS e SFTP. Aggiungi -u user:password per l'accesso autenticato. Usa -O per mantenere il nome file remoto.

$ curl -u user:pass -o backup.sql ftp://ftp.example.com/db/backup.sql

Download con autenticazione

Usa -u user:pass per Basic Auth, o -H per passare un Bearer token o API key. Combinalo con -L e -o per un download completo.

$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/export

Download affidabile con ripresa e retry

Combina -C - (ripresa), --retry (retry automatico in caso di errore) e -L (segui redirect) per download robusti che sopravvivono alle interruzioni di rete.

$ curl -C - --retry 5 --retry-delay 10 -L -o largefile.zip https://cdn.example.com/largefile.zip

Domande frequenti sul download con curl

Qual è la differenza tra curl -o e curl -O?

-o nomefile salva il download con il nome file esatto che specifichi. -O estrae il nome file dall'URL e lo usa. Usa -o quando vuoi un nome o percorso personalizzato; usa -O quando il nome file remoto va bene così com'è.

Perché curl scarica un file vuoto o HTML invece del file effettivo?

L'URL probabilmente restituisce un redirect HTTP (301 o 302). Per default, curl salva la risposta di redirect stessa — non il contenuto finale. Aggiungi -L per seguire automaticamente i redirect: curl -L -o file URL.

Come posso riprendere un file parzialmente scaricato con curl?

Usa curl -C - -o nomefile URL. Il flag -C - rileva la dimensione del file esistente e invia un header Range per richiedere solo i byte rimanenti. Il server deve supportare le range request perché funzioni.

Come posso limitare la velocità di download in curl?

Usa --limit-rate con un valore e suffisso: curl --limit-rate 500k -o file URL limita la velocità a 500 KB/s. Suffissi: k (KB/s), M (MB/s), G (GB/s).

Può curl scaricare più file contemporaneamente?

Sì. Usa più flag -O: curl -O URL1 -O URL2 -O URL3. curl li scarica sequenzialmente. Per download paralleli, pipe una lista di URL a xargs -P 4 -I {} curl -O {}.

Come posso scaricare un file che richiede autenticazione?

Per HTTP Basic Auth: curl -u user:pass -o file URL. Per Bearer token: curl -H "Authorization: Bearer TOKEN" -o file URL. Per API key negli header: curl -H "X-API-Key: KEY" -o file URL.

Come posso scaricare file da un server FTP con curl?

Usa curl -u user:pass -o filelocale ftp://host/percorso/file. curl supporta nativamente FTP, FTPS (FTP over TLS) e SFTP (SSH FTP). Per FTP anonimo, ometti -u.

Come posso scaricare file grandi in modo affidabile con curl?

Combina -C - (riprendi in caso di errore), --retry 5 (retry automatico), --retry-delay 10 e -L (segui redirect): curl -C - --retry 5 --retry-delay 10 -L -o file URL. Questo gestisce automaticamente i problemi di rete.

Come posso mostrare una barra di avanzamento durante il download con curl?

Usa curl -# -o file URL per una semplice barra di avanzamento. L'output predefinito di curl mostra già la velocità di trasferimento, la percentuale e il tempo stimato. Per gli script, usa -s per sopprimere tutto l'output.

Posso specificare una directory di download in curl?

Con curl 7.73+, usa --output-dir /percorso/dir combinato con -O. Per versioni precedenti, specifica il percorso completo con -o /percorso/dir/nomefile. Aggiungi --create-dirs se la directory non esiste ancora.

Dovrei usare curl o wget per scaricare file?

Entrambi sono eccellenti. wget è più semplice per il mirroring ricorsivo di siti web e ha una logica di retry integrata. curl supporta oltre 25 protocolli (non solo HTTP/FTP), è migliore per chiamate API e scripting, supporta più metodi di autenticazione ed è disponibile su praticamente ogni sistema operativo.

Come posso usare curl in uno script bash per scaricare file?

Usa curl -fsSL -o file URL: -f fallisce silenziosamente sugli errori HTTP (non salva la pagina di errore), -s silenzioso, -S mostra errori anche in modalità silenziosa, -L segui redirect. Controlla il codice di uscita: if ! curl -fsSL -o file URL; then echo "Download fallito"; exit 1; fi.