wget and curl overlap on "download a URL", and both do that job well — but their centres of gravity differ. curl is a protocol toolbox for talking to endpoints; wget is a retriever for pulling content down, recursively and resiliently. Choosing between them is choosing the job.
The overlap: plain downloads #
$ wget https://aospix.com/og.jpg
$ curl -O https://aospix.com/og.jpg
wget saves under the remote name by default and prints a progress bar; curl needs -O (remote name) or -o file and stays quiet unless asked. For one file, the difference is preference.
Where wget earns its name: getting all of it #
The killer feature is recursive download — mirroring a site or a directory tree:
$ wget -m -k -p https://aospix.com/blog
-m mirrors (infinite depth, timestamps), -k converts links to local paths, -p pulls page requisites (CSS, images). The result opens from disk — a website snapshot in one command.
Resumability is the other backbone. Interrupted transfers continue instead of restarting:
$ wget -c https://cdn.example.com/aospix-1.0.iso
$ wget -c --tries=20 --waitretry=5 https://slow-mirror.example/big.bin
-c picks up at the byte where the connection died — decisive on multi-gigabyte ISOs over flaky links, and paired with --tries/--waitretry it survives genuinely bad networks.
| Want | Tool | Form |
|---|---|---|
| Mirror a site | wget | wget -m -k -p URL |
| Resume a big download | wget | wget -c URL |
| Throttled politeness | wget | --limit-rate=500k -w 2 |
| API request, headers, auth | curl | curl -H ... -d ... |
| Download with progress in scripts | curl | curl -fL -o file URL |
| Follow redirects, fail on error | curl | curl -fL |
Where curl wins #
Anything conversational: custom headers, POST bodies, auth schemes, multiple protocols (SFTP, SMTP...), and clean exit codes for scripting — curl -sf fails silently-and-checkably where wget's option vocabulary stops. The curl note covers that half; wget does not try to be it.
Politeness, briefly #
Recursive fetching hits a server the way a small denial-of-service does. wget defaults (-w wait between requests, --limit-rate) exist for a reason; respect robots.txt unless you own the target, and mirror your own sites, not other people's.
For archived downloads — a dataset, an old release — check whether the server offers rsync or a torrent first; rsync resumes by block instead of by byte, which is kinder to everyone on links that keep breaking.
Both tools sit on the sockets and DNS layers everything else uses. The network series continues.
