wget скачивает файлы по URL и по умолчанию сохраняет их на диск под именем из адреса. Он умеет докачивать оборванные загрузки, ходить по ссылкам рекурсивно и сам следует редиректам. Для разового «скачай файл» он проще curl; для запросов к API с методами и заголовками удобнее curl.
Синтаксис
wget [опции] URL [URL…]
Журнал работы (Connecting…, 200 OK, прогресс) идёт в stderr, тело — в файл.
Опции
Куда сохранять
| Опция | Что делает |
|---|
-O файл | сохранить в этот файл; -O - — в stdout |
-P каталог | сохранять в каталог (по умолчанию текущий) |
-nc | не скачивать, если файл уже есть (иначе появится имя.1) |
-N | скачивать, только если на сервере файл новее локального |
-c | докачать частично скачанный файл (нужна поддержка Range сервером) |
--content-disposition | взять имя файла из заголовка Content-Disposition |
Что выводить
| Опция | Что делает |
|---|
-q | тихо: без журнала |
-nv | кратко: одна строка на файл |
-S | показать заголовки ответа сервера |
-o файл / -a файл | писать журнал в файл / дописывать в файл |
--spider | ничего не скачивать, только проверить, что URL существует |
Запрос
| Опция | Что делает |
|---|
--header 'Имя: значение' | добавить заголовок; можно повторять |
-U строка | свой User-Agent |
--user u --password p | HTTP-авторизация (Basic/Digest) |
--post-data 'a=1&b=2' / --post-file файл | отправить POST |
--no-check-certificate | не проверять TLS-сертификат |
--max-redirect=N | не больше N редиректов (0 — не ходить по ним) |
-T сек | таймаут на соединение и чтение |
-t N | число попыток (по умолчанию 20; 0 — бесконечно) |
--limit-rate=200k | ограничить скорость |
-i файл | взять список URL из файла (по одному на строку) |
Рекурсивная загрузка
| Опция | Что делает |
|---|
-r | рекурсивно идти по ссылкам из HTML |
-l N | глубина рекурсии (по умолчанию 5) |
-np | не подниматься выше стартового каталога |
-nd | не создавать каталоги — все файлы в одну папку |
-nH | не создавать каталог с именем хоста |
-A шаблоны / -R шаблоны | скачивать только / не скачивать файлы по суффиксу или шаблону: -A 'pdf,txt' |
-k | переписать ссылки в скачанных HTML на локальные |
-p | докачать всё, что нужно для показа страницы (картинки, CSS) |
-m | зеркало: то же, что -r -N -l inf --no-remove-listing |
Коды выхода
| Код | Значение |
|---|
0 | всё хорошо |
1 | общая ошибка |
2 | ошибка разбора опций |
3 | ошибка записи файла |
4 | сетевая ошибка: не удалось соединиться, таймаут, имя не резолвится |
5 | не прошла проверка TLS-сертификата |
6 | ошибка авторизации (401) |
7 | ошибка протокола |
8 | сервер ответил ошибкой: 404, 500… |
wget или curl
| Задача | wget | curl |
|---|
| сохранить файл | по умолчанию | нужен -O или -o |
| следовать редиректам | по умолчанию | нужен -L |
| ошибка HTTP → ненулевой код | по умолчанию (8) | нужен -f |
| рекурсивно скачать сайт | -r | не умеет |
| методы PUT/DELETE, произвольное тело, JSON-API | неудобно | -X, -d, -H |
Примеры
# скачать файл под его именем
wget http://localhost:8080/backup.tar.gz
# в конкретный файл, тихо
wget -q -O /tmp/page.html http://localhost:8080/
# в stdout — для конвейера
wget -qO- http://localhost:8080/api/status | jq .
# только заголовки ответа, тело выбросить
wget -S -q -O /dev/null http://localhost:8080/
# проверить, что URL существует (код 0) или нет (код 8)
wget -q --spider http://localhost:8080/health && echo ok
# докачать оборванную загрузку
wget -c http://localhost:8080/big.iso
# несколько файлов по списку, в каталог downloads
wget -q -i urls.txt -P downloads
# скачать все .txt, на которые ссылается страница, без дерева каталогов
wget -r -l 1 -nd -A txt http://localhost:8080/index.html
# быстрый таймаут и одна попытка — для скриптов
wget -q -T 5 -t 1 http://10.0.0.5/ || echo "код $?"
# Basic-авторизация и свой заголовок
wget -qO- --user admin --password secret --header 'Accept: application/json' http://localhost:8080/private/
Подводные камни
-O создаёт файл даже при ошибке. wget -O out.html http://…/nope получит 404 и оставит пустой out.html. Проверяй код выхода, а не наличие файла.
- Повторный запуск не перезаписывает файл, а создаёт
имя.1, имя.2… Нужно перезаписать — используй -O имя; не качать повторно — -nc или -N.
-c требует поддержки Range на сервере. Если сервер её не умеет (например, python3 -m http.server), wget скачает файл заново целиком.
-O с несколькими URL склеивает их в один файл подряд.
-t по умолчанию 20 попыток. «Соединение отклонено» и 404 не повторяются, а вот таймауты и обрывы — до 20 раз, и wget на недоступном адресе может висеть минутами. В скриптах ставь -T и -t 1.
--spider всё равно соединяется с сервером — это не офлайн-проверка; при -r он обходит ссылки, но не сохраняет файлы.
- Журнал идёт в stderr.
wget … | grep по журналу не сработает: сначала 2>&1.
-A всё равно скачивает HTML при -r, чтобы найти в нём ссылки, а потом удаляет его.
См. также
curl · htpasswd · nginx · ab · python3