The main differences as I (Daniel Stenberg) see them. Please consider my
bias towards curl since after all, curl is my baby - but I contribute to Wget as well.
Please let me know if you have other thoughts or comments on this document.
What both do
- both are command line tools that can download contents from FTP, HTTP and
- both can send HTTP POST requests
- both support HTTP cookies
- both are designed to work without user interaction, like from within scripts
- both are fully open source and free software
- both projects were started in the 90s
How they differ
- library. curl is powered by libcurl - a cross-platform
library with a stable API that can be used by each and everyone. This
difference is major since it creates a completely different attitude on how to
do things internally. It is also slightly harder to make a library than a
"mere" command line tool.
- Pipes. curl works more llke the traditional
unix cat command, it sends more stuff to stdout, and reads more from stdin in a
"everything is a pipe" manner. Wget is more like cp, using the same analogue.
- Single shot. curl is basically made to do single-shot transfers of
data. It transfers just the URLs that the user specifies, and does not contain
any recursive downloading logic nor any sort of HTML parser.
- More protocols. curl supports FTP, FTPS, Gopher, HTTP, HTTPS, SCP,
SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMB/CIFS, SMTP, RTMP
and RTSP. Wget only supports HTTP, HTTPS and FTP.
- More portable. curl builds and runs on lots of more platforms than
wget. For example: OS/400, TPF and other more "exotic" platforms that aren't
straight-forward unix clones.
- More SSL libraries and SSL support. curl can be built with one out
of eleven (11!) different SSL/TLS libraries, and it offers more control and
wider support for protocol details. curl supports public key pinning.
- HTTP auth. curl supports more HTTP authentication methods,
especially over HTTP proxies: Basic, Digest, NTLM and Negotiate
- SOCKS. curl supports several SOCKS protocol versions for proxy
- Bidirectional. curl offers upload and sending capabilities. Wget
only offers plain HTTP POST support.
- HTTP multipart/form-data sending, which allows users to do HTTP
"upload" and in general emulate browsers and do HTTP automation to a wider
- curl supports gzip and inflate Content-Encoding and
does automatic decompression
- curl offers and performs decompression of
Transfer-Encoded HTTP, wget doesn't
- curl supports HTTP/2 and it does dual-stack connects using
- curl supports metalink
- Much more developer activity. While this can be debated, I
consider three metrics here: mailing list activity, source code commit
frequency and release frequency. Anyone following these two projects can see
that the curl project has a lot higher pace in all these areas, and it has
been so for 10+ years. Compare
- Wget is command line only. There's no lib or anything.
- Recursive! Wget's major strong side compared to curl is its
ability to download recursively, or even just download everything that is
referred to from a remote resource, be it a HTML page or a FTP directory
- Older. Wget has traces back to 1995, while curl can be
tracked back no earlier than the end of 1996.
- GPL. Wget is 100% GPL v3. curl is MIT licensed.
- GNU. Wget is part of the GNU project and all copyrights are assigned to FSF. The curl project
is entirely stand-alone and independent with no organization parenting at all
- with almost all copyrights owned by Daniel.
- Wget requires no extra options to simply download a remote URL to
a local file, while curl requires -o or -O.
- Wget supports the Public Suffix List for handling cookie domains, curl does not.
- Wget supports only GnuTLS or OpenSSL for SSL/TLS support
- Wget supports only Basic auth as the only auth type over HTTP proxy
- Wget has no SOCKS support
- Its ability to recover from a prematurely broken transfer and continue
downloading has no counterpart in curl.
- Wget can be typed in using only the left hand on a qwerty keyboard!
Some have argued that I should compare uploading capabilities with wput, but that's a separate tool and I
don't include that in this comparison.
Two other capable tools with similar feature set include aria2c and axel (dead project?) - try them out!
For a stricter feature by feature comparison (that also compares other
similar tools), see the curl comparison
Feedback and improvements by: Micah Cowan, Olemis Lang
- Mar 2015 - eleven TLS libs
- Jan 2015 - Added PSL and corrected metalink info. Mention SMB, Gopher and key pinning. Mention wget's continuation support. Added axel and aria2c mentions.
- Dec 2013 - curl supports ten SSL libs, converted to a table layout
- Jul 2012 - more SSL libs and metalink, clarify proxy auth and socks shortage in wget
- Aug 2011 - recent wget versions do HTTP 1.1 so I removed that paragraph, added other minor differences
- Jan 2011 - fixed the SSL library count again, added the "What both does" section
- Apr 2010 - added more protocols, and corrected the SSL library count. Minor language fix.