← Весь справочник

wget

Скачивание файлов по HTTP/HTTPS — докачка, проверка ссылок, рекурсивная загрузка, коды выхода

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 pHTTP-авторизация (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

Задачаwgetcurl
сохранить файлпо умолчаниюнужен -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