If you want to fetch files quickly, automate downloads, or test web servers, cURL is the tool to use. It works on all major platforms including Windows, Mac, and Linux, and can handle everything from simple downloads to complex scripts. Mastering using cURL requires understanding its finer details, and we are here to guide you through the process step by step.
Master File Naming
By default, cURL doesn’t save files to disk. It streams content right into your terminal window. So, if you want the file, you’ve got to tell it where to go.
Save with a custom filename:
curl -o test.html https://example.com
This grabs the webpage and saves it as test.html
in your current folder.
Want to save somewhere else? Just specify the path:
curl -o ~/Downloads/test.html https://example.com
Heads-up: If the file already exists, it gets overwritten — no warning. To avoid accidental overwrites, try this:
if [ -f file.txt ]; then
echo "File already exists!"
else
curl -O https://example.com/file.txt
fi
This little script checks for the file first, then downloads only if it's missing. Simple safeguard. Always worth it.
Dealing with Redirects
Many download links redirect you behind the scenes. Browsers handle it automatically, but cURL needs a nudge:
curl -L -o test.zip https://example.com/download
The -L
flag tells cURL to follow redirects until it hits the real file. Without it? You’ll download the redirect page instead of the file itself.
Why does this matter?
Shortened URLs (Bit.ly, TinyURL) rely on redirects.
Many sites forward HTTP → HTTPS for security.
Some servers gate downloads behind redirects for control.
Too many redirects? Limit them:
curl -L --max-redirs 5 -o file.zip https://example.com/download
If the redirect count hits your limit, cURL stops and warns you. Smart.
Downloading Multiple Files Like a Pro
For any OS:
Just stack multiple -O
flags:
curl -O https://example.com/file1.zip -O https://example.com/file2.zip
Or use brace expansion for sequential files:
curl -O https://example.com/file{1,2,3}.zip
Windows PowerShell:
Download from a list in urls.txt
:
Get-Content urls.txt | ForEach-Object { curl -O $_ }
Loop for numbered files:
For ($i=1; $i -le 3; $i++) { curl -O "https://example.com/file$i.zip" }
Linux / macOS Terminal:
From a file:
xargs -n 1 curl -O < urls.txt
Loop for numbered files:
for i in {1..5}; do
curl -O https://example.com/file$i.zip
done
Manage Your Bandwidth
Downloading massive files over shaky or limited networks? Use --limit-rate
to cap your speed.
curl --limit-rate 500k -O https://example.com/archive.zip
This limits the download to 500 KB/s. Why bother? Because throttling reduces connection drops, avoids server blocks, and saves mobile data.
You can combine this with batch downloads:
Windows PowerShell:
1..3 | ForEach-Object { curl --limit-rate 500k -O https://example.com/archive$_.zip }
Linux/macOS Bash:
for i in {1..3}; do
curl --limit-rate 500k -O https://example.com/archive$i.zip
done
Silent Downloads and Error Handling
By default, cURL chatters away showing progress and speed. Need silence? Use:
curl -s -O https://example.com/file.zip
Want silent mode but still see errors?
curl -s -S -O https://example.com/file.zip
Perfect for scripts where you only want to catch issues without clutter.
Authentication
Many protected files or APIs need credentials. cURL supports them all.
Username + password:
curl -u username:password -O https://example.com/protected-file.zip
If your password has special characters, quote it:
curl -u username:"p@ss#word!" -O https://example.com/protected-file.zip
If you omit the password, cURL will prompt you interactively.
Using access tokens (Bearer tokens):
curl -H "Authorization: Bearer your_token_here" -O https://api.example.com/data.json
Proxy Support
Working behind a corporate firewall or need anonymity? Use a proxy.
Basic syntax:
curl -x http://proxy.server:port -o file.zip https://example.com/archive.zip
With proxy authentication:
curl -x http://proxy.example.com:80 -U user:password -o archive.zip https://example.com/archive.zip
For SOCKS proxies:
curl --proxy socks5h://proxy.example.com:1080 -o archive.zip https://example.com/archive.zip
socks5h
is safer because DNS queries go through the proxy, hiding your traffic better.
Track Your Download
Want a sleek progress bar instead of cluttered percentages?
curl -# -o file.zip https://example.com/file.zip
For detailed debugging info:
curl -v -o file.zip https://example.com/file.zip
After the download finishes, show speed stats:
curl -o file.zip -w "Download speed: %{speed_download} bits per second\n" https://example.com/file.zip
This is gold when diagnosing slow or flaky connections.
Know Your Requests and Responses
Use verbose mode to peek behind the curtain:
curl -v -o file.zip https://example.com/archive.zip
You’ll see:
Server IP and connection setup
HTTP requests sent
Status codes (200, 301, 404, etc.)
Response headers (content type, caching, etc.)
This helps pinpoint problems before wasting time on downloads.
Wrapping Up
cURL is a powerful command-line downloader known for its speed and flexibility. It offers features like precise file naming, redirect handling, multiple downloads, bandwidth control, authentication, proxy support, and progress tracking. Whether running simple scripts or building complex pipelines, cURL adapts to your needs as a trusted tool for managing web resources.