暗色模式

wget 命令行:从文件下载到递归镜像与断点续传

技术教程
2026-08-21
9
0
本文要点
  • wget 是最常用的命令行下载工具,与 curl 定位不同:wget 更擅长整站递归下载、断点续传和后台任务,适合批量拉取资源。
  • 单文件下载用 wget URL;用 -O 重命名保存、-q 静默、-nv 精简输出、-S 查看服务器响应头。
  • 断点续传用 wget -c,配合 --limit-rate 限速、--tries/--timeout 控制重试与超时,适合下载大文件。
  • 递归下载用 wget -r -np -nH 抓取整个目录,配合 -N 时间戳判断可做到增量同步(类似镜像站点)。
  • 批量下载用 -i 指定 URL 列表文件,后台下载用 -b,再结合 wget.log 查看进度。

wget 简介:和 curl 有什么不同

Linux 下最经典的命令行下载工具有两个:wgetcurl。虽然它们都能下载文件,但设计哲学不同:

  • wget(GNU Wget)是专职下载器:专注下载本身,天然支持断点续传、递归抓取整站、后台下载、批量 URL 列表,非常适合拉取软件包、备份目录、镜像一个站点。
  • curl多功能传输工具:能发送任意 HTTP 方法、携带请求头、处理 API 调用,偏向"给服务器发请求拿数据",它的单个文件下载只是一小部分能力。

简单来说,下载大文件、抓整站用 wget;调试接口、发请求用 curl。两者经常配合使用。

本文用一台 Ubuntu 24.04 上的本地 HTTP 服务演示 wget 的常见场景,先看一下版本:

wget --version | head -1
GNU Wget 1.21.4 built on linux-gnu.

基本下载:单文件与重命名保存

直接下载到当前目录

最简单的用法就是 wget <URL>,文件会以服务器上的名字保存到当前目录,并显示连接过程、HTTP 状态码、文件大小与下载进度:

wget http://127.0.0.1:8901/files/a.txt

输出大致如下:

--2026-08-21 20:07:42--  http://127.0.0.1:8901/files/a.txt
Connecting to 127.0.0.1:8901... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12 [text/plain]
Saving to: 'a.txt'
100% [=============================>] 12 --:--:-- ETA
2026-08-21 20:07:42 (1.07 MB/s) - 'a.txt' saved [12/12]

其中 200 OK 表示请求成功,Length: 12 [text/plain] 是文件大小(12 字节)和 MIME 类型,最后一行是保存路径和实际收到的字节数。

用 -O 指定保存文件名

如果不想用服务器原名,而想自定义文件名(比如把某个较长的名字换成易记的名字),用 -O

wget -O save-as.txt http://127.0.0.1:8901/files/a.txt

-O 后面跟的是你想保存的路径或文件名。

下面这张图演示了基本下载与重命名保存的完整过程——先直接下载得到 a.txt,再用 -O 保存为 save-as.txt,最后用 catls 验证内容与文件:

wget 基本下载与重命名

静默与精简输出

  • wget -q:安静模式,不输出任何内容,常用于脚本里,配合 && 判断成功与否。
  • wget -nv:非冗长模式,只显示摘要不显示进度条,比 -q 提供更多信息,适合写在文章、演示里避免刷屏。
wget -q http://127.0.0.1:8901/files/a.txt   # 无任何输出
wget -nv http://127.0.0.1:8901/files/a.txt  # 一行摘要

用 -S 查看服务器响应头

想要确认服务器返回了什么(状态码、ServerContent-Type 等),加 -S--server-response,响应的原始头部会先打印出来:

wget -S -O /dev/null http://127.0.0.1:8901/files/a.txt
  HTTP/1.0 200 OK
  Server: SimpleHTTP/0.6 Python/3.12.3

断点续传:大文件下载不掉线

下载大文件时网络偶尔中断,如果从头再来既浪费时间又费流量。wget断点续传能记住已下载的进度,从断点继续。

用 --limit-rate 限速

服务器或网络不稳定时,用 --limit-rate 限制下载速度,避免瞬时占满带宽。示例如下(单位可写 km):

wget -q --limit-rate=20k http://127.0.0.1:8901/files/big.bin

这里把速度限制在 20KB/s,下载一个 5MB 的文件,2 秒后我们用 timeout 中断它,此时文件只下载了一部分。

用 -c 从断点继续

中断后文件并不作废,用 -c(continue)接着上次的进度继续下载:

wget -c http://127.0.0.1:8901/files/big.bin

需要注意:只有当本地已存在同名文件且 wget 知道它不完整时,-c 才会续传。如果本地文件是完整的,-c 会提示 File already fully retrieved

这张图演示了完整的断点续传流程:先用限速下载制造一个"半成品"(40KB),再用 -c 续传,最终得到完整文件(5MB):

wget 断点续传演示

控制重试与超时

网络抖动时,--tries 控制重试次数,--timeout 控制单次连接/读取超时:

wget --tries=5 --timeout=30 http://example.com/big.iso

--tries=0 表示无限重试。超时的单位是秒,--timeout=30 即 30 秒无响应就重试。

递归下载:抓取整个目录

wget 最有价值的特性之一就是递归下载,可以顺着页面里的链接一层层把整个目录甚至整个网站抓下来。

wget -r -np -nH -nv --no-remove-listing http://127.0.0.1:8901/files/

这里几个关键参数:

  • -r(recursive):递归下载,顺着链接抓取子页面/子文件。
  • -np(no-parent):不向上回溯,只抓当前目录及其子目录,绝不爬到父级目录去。做目录镜像时几乎必加。
  • -nH(no-host-directories):不额外创建以主机名命名的顶层目录,直接把内容存到当前目录,路径更干净。
  • --no-remove-listing:Python 的目录列表页会生成 index.html,加上它避免因为保留这个文件而干扰结果展示。

运行后会把 files/ 下所有文件(含 sub/ 子目录)一层层扒下来,最后我们梳理出下载到的文件树:

wget 递归下载目录演示

从上图可以看到,files/ 下所有文件连同一个 sub/b.txt 子目录都被完整下载下来,结尾还统计了 Downloaded: 6 files,说明递归抓取成功。

时间戳同步 -N:增量镜像

递归下载还有个常用组合是 -N(timestamping)。它会对本地与服务器文件比较时间戳,服务器上的文件没更新就不重新下载,从而实现"增量同步",非常适合定期镜像站点或同步数据目录:

wget -r -np -nH -N http://127.0.0.1:8901/files/

当服务器文件没有变化时,第二次运行 wget 会收到 304 Not Modified,直接跳过:

HTTP request sent, awaiting response... 304 Not Modified
File 'a.txt' not modified on server. Omitting download.

镜像整站 -m

如果要完整镜像一个网站(包括把页面里的链接改成相对路径便于离线浏览),用 -m(mirror)。-m 等价于 -r -N -l inf --no-remove-listing,再配上 -k(convert-links)把链接转成本地相对链接,就是标准的整站镜像组合:

wget -m -k http://example.com/

批量与后台下载

用 -i 从列表文件批量下载

需要下载多个文件时,把 URL 逐行写进一个列表文件,用 -i 指定,wget 会逐个下载:

printf "http://127.0.0.1:8901/files/a.txt\nhttp://127.0.0.1:8901/files/sub/b.txt\n" > urls.txt
wget -i urls.txt

这样比手动敲多个 URL 更清晰,也方便脚本自动生成列表。

用 -b 后台下载

过大的文件不想一直占着终端,可用 -b(background)把下载丢到后台,wget 会提示进程 PID,并通过 wget.log 记录进度:

wget -bq http://127.0.0.1:8901/files/big.bin
Continuing in background, pid 2085574.

这时可以正常做其他事情,随时用下面的命令查看进度与结果:

tail -f wget.log   # 实时查看下载进度
pgrep -f wget      # 确认后台进程还在

常用 wget 参数速查

参数作用
-O <file>指定保存文件名
-q / -nv静默 / 精简输出
-S打印服务器响应头
-c断点续传
--limit-rate=<速度>限制下载速度
--tries=<n> / --timeout=<s>重试次数 / 超时秒数
-r递归下载
-np不回溯父目录
-nH不创建主机名目录
-N按时间戳增量同步
-m镜像整站
-k转换链接为本地相对链接
-i <file>从列表文件批量下载
-b后台下载

小结

wget 是 Linux 运维中下载类任务的主力工具:单文件下载、重命名保存、断点续传、限速、递归抓取目录、镜像整站、批量与后台下载,基本覆盖了日常所有下载场景。

curl 的分工也很明确——要快速、稳健地把文件从网络上"拿走",首选 wget;要精确控制 HTTP 请求去调试接口,就用 curl。把两者各记几招,命令行下处理文件传输基本就够用了。

更多选项可用 wget --helpman wget 查看完整文档。

发表评论

暂无评论,快来抢沙发吧!