Curl 下载文件入门:快速学会与应用实践
在日常的开发和系统管理中,我们经常需要在命令行环境下下载文件。虽然 wget 也是一个流行的选择,但 curl 作为一个功能更为强大的工具,不仅可以传输数据,还能支持各种协议(HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE, IMAP, POP3, SMTP, RTMP 和 RTSP),使其在文件下载方面表现出色。
本文将带你快速入门 curl 下载文件,并通过实际应用场景加深理解。
什么是 Curl?
curl 是一个命令行工具,用于通过各种协议传输数据。它的名字是 “Client for URLs” 的缩写,意为 URL 客户端。它支持多种认证方式、代理、断点续传等高级功能,使其成为开发者和系统管理员的得力助手。
1. 最基本的下载
curl 最常见的用途是下载文件。有两种基本方式:
1.1 使用 -O (大写 O):保存为远程文件名
这是最直接的方式。curl -O 会将下载的文件保存到当前目录,文件名与远程服务器上的文件名相同。
示例:
bash
curl -O https://example.com/somefile.zip
如果 somefile.zip 已经存在,curl 会创建一个新的文件,例如 somefile.zip.1。
1.2 使用 -o (小写 o):指定本地文件名
如果你想将文件保存为不同的名字,或者文件没有一个明显的远程文件名(例如从一个动态生成的 URL 下载),可以使用 -o 参数。
示例:
bash
curl -o my_custom_name.zip https://example.com/somefile.zip
这将把 https://example.com/somefile.zip 下载并保存为本地的 my_custom_name.zip。
2. 下载进度与详细信息
curl 默认会显示一个简单的下载进度条。
2.1 显示详细进度 (-# 或 --progress-bar)
如果你希望看到一个更直观的进度条,可以使用 -# 或 --progress-bar 参数。
示例:
bash
curl -# -O https://example.com/largefile.tar.gz
2.2 显示详细操作 (-v 或 --verbose)
在调试或需要了解 curl 具体做了什么时,-v 参数非常有用。它会显示请求头、响应头、SSL/TLS 握手信息等。
示例:
bash
curl -v -o index.html https://example.com
2.3 静默下载 (-s 或 --silent)
如果你不希望看到任何输出(除了错误信息),可以使用 -s 参数。这在脚本中非常有用。
示例:
bash
curl -s -O https://example.com/silent_download.txt
如果需要静默下载但仍然显示错误信息,可以结合使用 -S (Show error) 参数:
bash
curl -sS -O https://example.com/silent_download_with_error.txt
3. 断点续传 (-C -)
这是一个非常实用的功能,特别是当下载大文件时网络中断,或者你暂停了下载。curl 可以从上次中断的地方继续下载。
使用 -C - 参数,curl 会自动检测本地文件的大小,并从正确的位置继续下载。
示例:
bash
curl -C - -O https://example.com/very_large_archive.iso
首次运行会从头下载。如果中断后再次运行相同的命令,它会从中断处继续。
4. 处理重定向 (-L)
许多网站在访问某个 URL 时会进行重定向(例如 HTTP 到 HTTPS,或临时重定向到 CDN)。curl 默认不会跟随这些重定向。如果你需要下载重定向后的文件,请使用 -L 参数。
示例:
bash
curl -L -O http://shorturl.at/abcde # 假设这是一个短链接,会重定向到实际文件
5. 下载多个文件
你可以在一个 curl 命令中指定多个 URL,并结合 -O 参数下载多个文件。
示例:
bash
curl -O https://example.com/file1.txt -O https://example.com/file2.zip
这会将 file1.txt 和 file2.zip 都下载到当前目录。
6. 使用认证
如果文件受密码保护,你可以使用 -u 参数提供用户名和密码。
示例:
bash
curl -u username:password -O https://secure.example.com/private_document.pdf
如果只提供用户名,curl 会提示你输入密码。
7. 高级应用场景
7.1 从 FTP 服务器下载
curl 可以很好地处理 FTP 协议。
示例:
bash
curl -u ftpuser:ftppassword -O ftp://ftp.example.com/public/data.csv
7.2 下载网页内容并管道到其他命令
curl 不仅仅是下载文件,它可以获取任何 URL 的内容。你可以将其输出管道到其他命令进行处理。
示例:
下载网页内容并查找特定字符串:
bash
curl -s https://example.com | grep "important_keyword"
下载 JSON API 响应并格式化:
bash
curl -s https://api.github.com/users/octocat | python -m json.tool
7.3 设置 User-Agent 和 Referer
有些网站会检查请求头中的 User-Agent 或 Referer。你可以使用 -A 和 -e 参数来模拟浏览器或其他客户端。
示例:
bash
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" \
-e "https://google.com" \
-O https://example.com/downloads/setup.exe
7.4 限速下载
如果你不希望 curl 占用所有带宽,可以使用 --limit-rate 参数限制下载速度。
示例:
限制下载速度为 100KB/s:
bash
curl --limit-rate 100K -O https://example.com/large_update.bin
总结
curl 是一个极其强大和灵活的工具,不仅仅局限于文件下载。通过掌握本文介绍的这些基本和进阶技巧,你将能够高效地在命令行环境中处理各种文件下载任务。记住 -O, -o, -C -, -L 和 -u 是你在日常工作中会频繁使用的关键参数。