wgetは、URLを指定してファイルをダウンロードするコマンドです。 wget URL と書くだけで、URLの末尾と同じ名前のファイルがカレントディレクトリに保存されます。途中で切れたダウンロードの再開、自動リトライ、リンクをたどる再帰取得までを1つのコマンドでこなせるのが特長です。

この記事では、手元に用意したテスト用サーバーに対して GNU Wget 1.21.4 を実際に動かし、そのログを載せています。 「やりたいこと→コマンド」の逆引き早見表、保存先(-P / -O)・再開(-c)・リトライ・再帰取得の実行ログ、403・証明書エラー・タイムアウトを再現したうえでの対処、同じ操作を curl で書くときの対応表、Fedora などで既定になっている wget2 との違いまでを1ページにまとめました。

wgetの逆引き早見表

「やりたいこと」から探せる一覧です。 すべて GNU Wget 1.21.4 で実行して確認しています。

やりたいこと コマンド 補足
ダウンロードする wget URL URL末尾の名前で保存
保存するファイル名を決める wget -O name.txt URL -O は大文字のオー
保存先ディレクトリを決める wget -P downloads URL ディレクトリがなければ作られる
画面に中身を出す wget -qO- URL -O- で標準出力へ
途中から再開する wget -c URL 同じ名前の途中までのファイルが必要
リトライ回数を決める wget -t 5 URL 既定は20回
リトライの待ち時間を決める wget --waitretry=10 URL 1秒、2秒…と増え、指定値が上限
接続拒否でもリトライする wget --retry-connrefused URL サーバーの起動待ちに
503 などでもリトライする wget --retry-on-http-error=503 URL コードはカンマ区切り
タイムアウトを決める wget -T 10 URL 秒で指定
配下をまとめて取得する wget -r -l 2 -np URL/ 2階層まで、親ディレクトリには上らない
拡張子で絞って取得する wget -r -np -nd -A pdf,png URL/ -nd でディレクトリを作らない
URL の一覧から取得する wget -i urls.txt 1行に1URL
存在だけ確かめる wget --spider URL 保存しない
速度を抑える wget --limit-rate=1m URL k、m の単位
バックグラウンドで実行 wget -b -o wget.log URL ログはファイルへ
ログを短くする / 出さない wget -nv URL / wget -q URL スクリプト向き

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「wgetコマンドの使い方|保存先・再帰・リトライとcurlの違い」

検証環境

実行ログは次の環境で取ったものです。 外部のサイトには接続せず、同じマシン上に Python で立てたテスト用サーバー(HTTP は 7890 番、HTTPS は 7891 番ポート)を相手にしています。ログ中の日時は 2026-10-03 10:00:00 に置き換えています。長いログは、要点の行だけを抜き出して載せている箇所があります。

項目 内容
OS Ubuntu 24.04.4 LTS
wget GNU Wget 1.21.4
wget2 GNU Wget2 2.1.0(比較用)
curl 8.5.0(比較用)
テスト用サーバー Python 3.11 の http.server を拡張したもの。403・503・応答待ち・自己署名証明書を再現

既定値(リトライ20回、読み取りタイムアウト900秒、再帰の深さ5階層など)は、GNU Wget の公式マニュアルを今回開いて確認した内容です。

基本の使い方とログの読み方

URLを指定してダウンロードする

$ wget http://127.0.0.1:7890/hello.txt
--2026-10-03 10:00:00--  http://127.0.0.1:7890/hello.txt
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11 [text/plain]
Saving to: ‘hello.txt’

     0K                                                       100% 2.80M=0s

2026-10-03 10:00:00 (2.80 MB/s) - ‘hello.txt’ saved [11/11]
ログの行 意味
Connecting to ... connected. サーバーに接続できた
HTTP request sent, awaiting response... 200 OK サーバーの応答(ステータスコード)
Length: 11 [text/plain] サイズと種類
Saving to: ‘hello.txt’ 保存するファイル名
saved [11/11] 受け取ったバイト数 / 全体のバイト数

進み具合の表示は、端末で実行するとバー形式、ログをファイルやパイプに出すと上のような点(ドット)形式になります。

同じ名前のファイルがあるときの動き

もう一度同じURLを取得すると、元のファイルは残したまま .1 を付けた名前で保存します。

$ wget -nv http://127.0.0.1:7890/hello.txt; ls
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/hello.txt [11/11] -> "hello.txt.1" [1]
hello.txt
hello.txt.1
オプション すでにファイルがあるとき 実行時の表示
なし hello.txt.1 として別名で保存 -> "hello.txt.1"
-nc 何もしない File ‘hello.txt’ already there; not retrieving.
-N サーバー側が新しいときだけ取得 304 Not Modified / not modified on server. Omitting download.
-O 名前 その名前で置き換える -> "名前"
-c 続きから取得(後述) 206 Partial Content

ログの量を調整する(-nv / -q / -S)

スクリプトでは -nv(1行に要約)か -q(何も出さない)が扱いやすくなります。サーバーの応答ヘッダーを見たいときは -S です。

$ wget -S --spider http://127.0.0.1:7890/hello.txt
Spider mode enabled. Check if remote file exists.
--2026-10-03 10:00:00--  http://127.0.0.1:7890/hello.txt
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... 
  HTTP/1.0 200 OK
  Server: SimpleHTTP/0.6 Python/3.11.15
  Content-type: text/plain
  Content-Length: 11
Length: 11 [text/plain]
Remote file exists.

(Date と Last-Modified の2行は省略しています。)--spider は保存せずに存在だけを確かめるモードで、&& と組み合わせて条件分岐に使えます。

$ wget -q --spider http://127.0.0.1:7890/none.txt && echo exists || echo 'not found'
not found

-q でログを消しつつ進み具合のバーだけ出したいときは --show-progress を足します。

$ wget -q --show-progress --progress=bar:force:noscroll http://127.0.0.1:7890/big.bin
big.bin             100%[===================>]   2.86M  --.-KB/s    in 0.004s

保存先を指定する(-P と -O の違い)

-P は「保存するディレクトリ」、-O は「保存するファイル名(パス)」を決めます。 似ていますが役割が違います。

# ファイル名を決める
$ wget -q -O greet.txt http://127.0.0.1:7890/hello.txt; cat greet.txt
hello wget

# ディレクトリを決める(なければ作られる)
$ wget -nv -P /tmp/t189dl/a/b http://127.0.0.1:7890/hello.txt
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/hello.txt [11/11] -> "/tmp/t189dl/a/b/hello.txt" [1]

# 画面に出す
$ wget -qO- http://127.0.0.1:7890/hello.txt
hello wget
項目 -P ディレクトリ -O ファイル
指定するもの 保存先のディレクトリ 保存するファイルのパス
ファイル名 URL末尾の名前のまま 自分で決める
ディレクトリがないとき 作ってくれる(深い階層も可) エラーになる
複数URLを渡したとき それぞれ別のファイルで保存 1つのファイルにつなげて保存
再帰取得(-r)との相性 向いている 向かない(全部が1ファイルになる)

直す前と後:-O でディレクトリがないと言われる

-O はディレクトリを作らないため、存在しない場所を指定すると次の表示になります(終了コードは 1)。

$ wget -nv -O out/x.txt http://127.0.0.1:7890/hello.txt
out/x.txt: No such file or directory

$ mkdir -p out && wget -nv -O out/x.txt http://127.0.0.1:7890/hello.txt
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/hello.txt [11/11] -> "out/x.txt" [1]

-P と -O を同時に書いたとき

両方を書くと -O が優先され、-P のディレクトリは使われませんでした。 x.txt は downloads の中ではなく、カレントディレクトリにできています。

$ wget -q -P downloads -O x.txt http://127.0.0.1:7890/hello.txt; ls downloads; ls x.txt
hello.txt
x.txt

(downloads の中の hello.txt は、その前に -P downloads だけで取得したものです。)ディレクトリも名前も決めたいときは、-O downloads/x.txt のように -O にパスごと書きます。

複数URLに -O を付けると1ファイルにつながる

$ wget -nv http://127.0.0.1:7890/hello.txt http://127.0.0.1:7890/docs/page1.html -O both.txt; wc -l both.txt
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/hello.txt [11/11] -> "both.txt" [1]
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/page1.html [67/67] -> "both.txt" [1]
2 both.txt

-O はシェルの > に近い働きで、取得した内容を順に同じファイルへ書き込みます。別々に保存したいときは -P を使います。

リダイレクトやダウンロード用URLでファイル名を整える

URLの末尾がファイル名らしくないとき、wget は URL 末尾の文字列をそのまま名前にします。サーバーが応答ヘッダー(Content-Disposition)で名前を知らせている場合は、--content-disposition でその名前を使えます。

$ wget -nv http://127.0.0.1:7890/dl
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/dl [12/12] -> "dl" [1]

$ wget -nv --content-disposition http://127.0.0.1:7890/dl
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/dl [12/12] -> "report-2026.csv" [1]

リダイレクト(302)は自動でたどりますが、名前は最初のURLの末尾から付きます。次の例では /old から /hello.txt に転送され、old という名前で保存されました。意図した名前にしたいときは -O を使います。

$ wget -nv http://127.0.0.1:7890/old
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/hello.txt [11/11] -> "old" [1]

中断したダウンロードを再開する(-c)

-c を付けると、途中まで保存されたファイルの続きから取得します。 3,000,000 バイトのファイルのうち 1,000,000 バイトだけ手元にある状態で試しました。

$ wget -c --progress=dot:mega http://127.0.0.1:7890/big.bin
--2026-10-03 10:00:00--  http://127.0.0.1:7890/big.bin
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 3000000 (2.9M), 2000000 (1.9M) remaining [application/octet-stream]
Saving to: ‘big.bin’

     0K ,,,,,,,, ,,,,,,,. ........ ........ ........ .....   100%  631M=0.003s

2026-10-03 10:00:00 (631 MB/s) - ‘big.bin’ saved [3000000/3000000]

206 Partial Content と remaining が出ていれば、続きから取得できています。 , はすでに手元にあった部分、. は今回受け取った部分です。取得後のファイルは元のファイルと一致しました(cmp で確認)。

すでに全部そろっているファイルに -c を付けても、取り直しにはなりません。

$ wget -c http://127.0.0.1:7890/big.bin
HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable

    The file is already fully retrieved; nothing to do.

直す前と後:-c を付け忘れると別名で最初から

# -c なし:途中までの big.bin(1,000,000バイト)はそのまま、big.bin.1 に最初から保存
$ wget -nv http://127.0.0.1:7890/big.bin; ls -l big.bin* | awk '{print $5, $9}'
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/big.bin [3000000/3000000] -> "big.bin.1" [1]
1000000 big.bin
3000000 big.bin.1
確認ポイント 内容
同じディレクトリで実行しているか -c は同じ名前のファイルを探して続きを取得する
-O を使った場合 再開時も同じ -O 名前 を付ける
サーバーが範囲指定に対応しているか ログに 206 Partial Content が出れば対応している
サーバー側のファイルが変わっていないか 中身が変わっていると、前半と後半で内容が合わなくなる。大きなファイルは取得後にチェックサム(sha256sum)で確認

リトライとタイムアウトを設定する

既定の動きを知る

公式マニュアルによると、リトライの既定は20回ですが、「接続拒否(connection refused)」と「404 などの見つからないエラー」はリトライの対象外です。タイムアウトは、読み取りの900秒だけが既定で有効になっています。

オプション 意味 既定
-t 数 / --tries=数 試行回数(0 で無制限) 20
-T 秒 / --timeout=秒 DNS・接続・読み取りのタイムアウトをまとめて設定 読み取りのみ900秒
--waitretry=秒 リトライ前の待ち時間の上限。1秒、2秒…と1秒ずつ増える 10
--retry-connrefused 接続拒否もリトライ対象にする 無効
--retry-on-http-error=コード 指定したHTTPステータスもリトライ対象にする なし
-w 秒 / --wait=秒 取得と取得の間に待つ時間(再帰や -i で使う) 0

タイムアウトを再現する(-T と -t)

応答を返さないURL(30秒待たせるようにしたもの)に、タイムアウト3秒・2回までで接続しました。

$ wget -T 3 -t 2 http://127.0.0.1:7890/slow.txt
--2026-10-03 10:00:00--  http://127.0.0.1:7890/slow.txt
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... Read error (Connection timed out) in headers.
Retrying.

--2026-10-03 10:00:00--  (try: 2)  http://127.0.0.1:7890/slow.txt
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... Read error (Connection timed out) in headers.
Giving up.

-T を指定しないと、読み取りは既定の900秒まで待ち続けます。スクリプトで使うときは -T 10 -t 3 のように、待つ時間と回数を自分で決めておくと、処理が長く止まる場面を防げます。終了コードは 4 でした。

接続拒否を再現する(--retry-connrefused)

何も動いていないポート(7892)に接続すると、-t 3 を付けていても1回で終わります。

$ wget -t 3 --waitretry=1 http://127.0.0.1:7892/x.txt
--2026-10-03 10:00:00--  http://127.0.0.1:7892/x.txt
Connecting to 127.0.0.1:7892... failed: Connection refused.

--retry-connrefused を足すと、指定した回数までリトライします。

$ wget -t 3 --waitretry=1 --retry-connrefused http://127.0.0.1:7892/x.txt
--2026-10-03 10:00:00--  http://127.0.0.1:7892/x.txt
Connecting to 127.0.0.1:7892... failed: Connection refused.
Retrying.

--2026-10-03 10:00:00--  (try: 2)  http://127.0.0.1:7892/x.txt
Connecting to 127.0.0.1:7892... failed: Connection refused.
Retrying.

--2026-10-03 10:00:00--  (try: 3)  http://127.0.0.1:7892/x.txt
Connecting to 127.0.0.1:7892... failed: Connection refused.
Giving up.

サーバーを起動した直後で、まだ接続を受け付けていない時間帯に取得したいときに役立ちます。

503 のときだけリトライする(--retry-on-http-error)

2回 503 を返したあと 200 を返すURLで試しました。オプションなしでは、最初の 503 で終了します。

$ wget -t 5 --waitretry=1 http://127.0.0.1:7890/flaky.txt
HTTP request sent, awaiting response... 503 Service Unavailable
2026-10-03 10:00:00 ERROR 503: Service Unavailable.

$ wget -nv -t 5 --waitretry=1 --retry-on-http-error=503 http://127.0.0.1:7890/flaky.txt
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/flaky.txt [11/11] -> "flaky.txt" [2]

コピペ用:途切れても粘り強く取得する組み合わせ

wget -c -t 5 -T 15 --waitretry=10 --retry-connrefused \
     --retry-on-http-error=429,500,502,503,504 \
     -P downloads URL

-c(再開)とリトライを組み合わせておくと、途中で切れても続きから取り直します。上の形のうち -c -t -T --waitretry --retry-connrefused -P の組み合わせはテスト用サーバーで動作を確認しました。--retry-on-http-error に並べたコードのうち、実際に再現したのは 503 です。

再帰取得でまとめてダウンロードする(-r -l -np)

-r はページ内のリンクをたどって取得します。-l で深さ、-np で「親ディレクトリに上らない」を指定するのが基本の組み合わせです。 テスト用サーバーには次の構成を用意しました。

/docs/index.html     → page1.html、guide/、manual.pdf、logo.png、../other/x.html へのリンク
/docs/page1.html     → guide/deep.html へのリンク
/docs/guide/index.html、/docs/guide/deep.html
/other/x.html        (docs の外)

1階層だけ取得する

$ wget -nv -r -l 1 -np http://127.0.0.1:7890/docs/
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/ [164/164] -> "127.0.0.1:7890/docs/index.html" [1]
http://127.0.0.1:7890/robots.txt:
2026-10-03 10:00:00 ERROR 404: File not found.
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/page1.html [67/67] -> "127.0.0.1:7890/docs/page1.html" [1]
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/guide/ [67/67] -> "127.0.0.1:7890/docs/guide/index.html" [1]
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/manual.pdf [5000/5000] -> "127.0.0.1:7890/docs/manual.pdf" [1]
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/logo.png [2000/2000] -> "127.0.0.1:7890/docs/logo.png" [1]
FINISHED --2026-10-03 10:00:00--
Downloaded: 5 files, 7.1K in 0s (176 MB/s)

読み取れることは3つです。

  • ホスト名(ここでは 127.0.0.1:7890)のディレクトリが作られ、その下にURLと同じ構成で保存される
  • 最初に robots.txt を取りに行く。 再帰取得では、サイト側が示す巡回ルールを確認する動きが既定になっている(今回は用意していないので 404)
  • -l 1 なので、2階層目の guide/deep.html は取得していない

-np の有無で変わる範囲

-np を外して2階層まで取得すると、docs の外にある /other/x.html も対象になりました。

$ wget -nv -r -l 2 http://127.0.0.1:7890/docs/ ; find 127.0.0.1:7890 -type f | sort
(ログ省略)
127.0.0.1:7890/docs/guide/deep.html
127.0.0.1:7890/docs/guide/index.html
127.0.0.1:7890/docs/index.html
127.0.0.1:7890/docs/logo.png
127.0.0.1:7890/docs/manual.pdf
127.0.0.1:7890/docs/page1.html
127.0.0.1:7890/other/x.html

指定したディレクトリの配下だけを取得したいときは -np を付けます。 -l を省くと深さは5階層まで(公式マニュアルの既定値)なので、範囲を決めるために -l も明示するのがおすすめです。

ディレクトリの形を整える(-nH --cut-dirs -P)

$ wget -nv -r -l 2 -np -nH --cut-dirs=1 -P site http://127.0.0.1:7890/docs/ ; find site -type f | sort
(ログ省略)
site/guide/deep.html
site/guide/index.html
site/index.html
site/logo.png
site/manual.pdf
site/page1.html
オプション 働き 上の例での効果
-nH ホスト名のディレクトリを作らない 127.0.0.1:7890/ がなくなる
--cut-dirs=1 URLの先頭から1階層ぶんを省く docs/ がなくなる
-P site 保存先の起点を決める site/ の下に保存
-nd ディレクトリを一切作らず、1か所に並べる 次の例で使用

拡張子で絞る(-A / -R)

$ wget -nv -r -l 2 -np -nd -A pdf,png -P assets http://127.0.0.1:7890/docs/; ls assets
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/ [164/164] -> "assets/index.html.tmp" [1]
(中略)
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/manual.pdf [5000/5000] -> "assets/manual.pdf" [1]
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/docs/logo.png [2000/2000] -> "assets/logo.png" [1]
logo.png
manual.pdf

HTML はリンクをたどるために一度 .tmp として取得され、最後に残るのは -A で指定した拡張子だけです。除外したいときは -R を使います。

再帰取得のオプション早見表

オプション 意味
-r リンクをたどって取得する
-l 数 たどる深さ(既定は5。inf で無制限)
-np 親ディレクトリには上らない
-A 一覧 / -R 一覧 取得する / 除外する拡張子やパターン
-p 1ページの表示に必要な画像やCSSも取得する
-k 保存後、リンクを手元で開ける形に書き換える
-m ミラー用。-r -N -l inf --no-remove-listing と同じ
-w 秒 / --random-wait 取得の間隔を空ける / 間隔をばらつかせる
--limit-rate=量 転送速度の上限

-w 1 --random-wait を付けて /docs/ を1階層ぶん取得したところ、5ファイルで全体 5.5 秒かかりました(付けない場合は 0.007 秒)。相手のサーバーに負荷をかけないよう、再帰取得では -w で間隔を空け、取得してよい範囲かどうかを利用規約と robots.txt で確かめてから実行します。

エラーを再現して対処を確かめる

403 Forbidden

テスト用サーバーに「User-Agent に Wget を含むリクエストには 403 を返す」設定を入れて再現しました。

$ wget http://127.0.0.1:7890/forbidden.txt
--2026-10-03 10:00:00--  http://127.0.0.1:7890/forbidden.txt
Connecting to 127.0.0.1:7890... connected.
HTTP request sent, awaiting response... 403 Forbidden
2026-10-03 10:00:00 ERROR 403: Forbidden.

403 は「リクエストは届いたが、サーバーが応じない」という応答です。原因はサーバー側のルールによってさまざまなので、次の順で確かめます。

確かめること 方法
URL が正しいか、ブラウザで開けるか ブラウザで同じURLを開く
認証が必要なページか --user / --password、または --header='Authorization: ...' を付ける
自動取得が許可されているか サイトの利用規約・robots.txt を読む
User-Agent で応答が変わるか 自分が管理するサーバーなら -U で値を変えて挙動を確認する

今回のテスト用サーバーでは、-U で User-Agent を変えると取得できました。

$ wget -nv -U 'Mozilla/5.0 (X11; Linux x86_64)' http://127.0.0.1:7890/forbidden.txt; cat forbidden.txt
2026-10-03 10:00:00 URL:http://127.0.0.1:7890/forbidden.txt [10/10] -> "forbidden.txt" [1]
secret ok

自分が管理していないサイトでは、403 は「自動取得を受け付けていない」という意思表示であることも多いため、まず提供元の案内(API や配布用URL)を探すのが近道です。

証明書エラー

自己署名証明書を使った HTTPS サーバーで再現しました。

$ wget https://127.0.0.1:7891/hello.txt
--2026-10-03 10:00:00--  https://127.0.0.1:7891/hello.txt
Connecting to 127.0.0.1:7891... connected.
ERROR: cannot verify 127.0.0.1's certificate, issued by ‘CN=localhost’:
  Self-signed certificate encountered.
To connect to 127.0.0.1 insecurely, use `--no-check-certificate'.

終了コードは 5 です。おすすめの対処は、信頼する証明書を --ca-certificate で指定することです。 検証を保ったまま接続できます。

$ wget -nv --ca-certificate=../cert.pem https://127.0.0.1:7891/hello.txt -O tls1.txt
2026-10-03 10:00:00 URL:https://127.0.0.1:7891/hello.txt [11/11] -> "tls1.txt" [1]

--no-check-certificate は検証そのものを省くオプションで、接続先が本物かどうかを確かめないまま通信します。

$ wget -nv --no-check-certificate https://127.0.0.1:7891/hello.txt -O tls2.txt
WARNING: cannot verify 127.0.0.1's certificate, issued by ‘CN=localhost’:
  Self-signed certificate encountered.
2026-10-03 10:00:00 URL:https://127.0.0.1:7891/hello.txt [11/11] -> "tls2.txt" [1]
状況 対処
社内や開発用の認証局・自己署名証明書 --ca-certificate=証明書.pem で信頼する証明書を指定
公開サイトで証明書エラー OS の証明書ストアを更新(Ubuntu なら ca-certificates パッケージ)。日時のずれも確認
手元の開発サーバーで一時的に試すだけ --no-check-certificate(公開サイトやスクリプトには残さない)

そのほかのエラーと終了コード

$ wget http://127.0.0.1:7890/none.txt
HTTP request sent, awaiting response... 404 File not found
2026-10-03 10:00:00 ERROR 404: File not found.

$ wget http://no-such-host.invalid/a.txt
Resolving no-such-host.invalid (no-such-host.invalid)... failed: Name or service not known.
wget: unable to resolve host address ‘no-such-host.invalid’

スクリプトでは、終了コードで結果を判定できます。 今回の再現で得られた値と、公式マニュアルの定義を並べます。

終了コード 公式マニュアルの定義 今回この値になった操作
0 問題なし 通常の取得
1 一般的なエラー -O の出力先ディレクトリがない
2 オプションの解析エラー 存在しないオプション(--badopt)
3 ファイルの入出力エラー (今回は再現していません)
4 ネットワークのエラー 接続拒否、名前解決できない、タイムアウト
5 SSL の検証エラー 自己署名証明書
6 認証エラー (今回は再現していません)
7 プロトコルのエラー (今回は再現していません)
8 サーバーがエラー応答を返した 404、403
$ wget -q -O /dev/null http://127.0.0.1:7890/hello.txt && echo OK || echo NG
OK

curlとの違いと書き換え対応表

wget は「ファイルとして保存する」ことが既定、curl は「標準出力に出す」ことが既定です。 wget はリダイレクトを自動でたどり、再帰取得ができます。curl は多くのプロトコルやHTTPメソッドに対応し、API を呼び出す用途に向いています。

観点 wget curl
既定の出力先 ファイル 標準出力
リダイレクト 自動でたどる -L が必要
再帰取得 -r でできる 機能なし
HTTP エラー時の終了コード 8 0(-f を付けると 22)
リトライ 既定で20回 --retry 数 を付けたときだけ
向いている用途 ファイルの取得、まとめての取得 API の呼び出し、ヘッダーやメソッドの細かな指定

同じ操作の書き換え表です。curl の列は curl 8.5.0 で同じテスト用サーバーに対して実行し、結果を確認しました。

やりたいこと wget curl
URL末尾の名前で保存 wget URL curl -O URL
名前を決めて保存 wget -O c.txt URL curl -o c.txt URL
ディレクトリを決めて保存 wget -P dir URL curl --output-dir dir --create-dirs -O URL
画面に出す wget -qO- URL curl -sS URL
リダイレクトをたどる (既定) curl -L URL
サーバーが示す名前で保存 wget --content-disposition URL curl -OJ URL
続きから再開 wget -c URL curl -C - -O URL
リトライ wget -t 5 --waitretry=1 URL curl --retry 5 --retry-delay 1 URL
接続拒否でもリトライ --retry-connrefused --retry-connrefused(--retry と併用)
タイムアウト wget -T 10 URL curl -m 10 URL
User-Agent を変える wget -U '値' URL curl -A '値' URL
証明書を指定 --ca-certificate=cert.pem --cacert cert.pem
ヘッダーだけ見る wget -S --spider URL curl -I URL
HTTP エラーを終了コードに反映 (既定) curl -f URL

同じエラーを curl で再現したときの表示です。

$ curl -sS -f http://127.0.0.1:7890/forbidden.txt
curl: (22) The requested URL returned error: 403

$ curl -sS https://127.0.0.1:7891/hello.txt
curl: (60) SSL certificate problem: self-signed certificate

$ curl -sS -m 2 http://127.0.0.1:7890/slow.txt
curl: (28) Operation timed out after 2001 milliseconds with 0 bytes received

$ curl -sS http://127.0.0.1:7890/old      # -L なしでは何も表示されない
$ curl -sSL http://127.0.0.1:7890/old
hello wget

curl は 503 に対して --retry だけでリトライし、3回目で取得できました(curl -sS -f --retry 5 --retry-delay 1 -o fl.txt URL)。wget では --retry-on-http-error=503 が必要だったので、リトライの対象になる条件が両者で違う点を覚えておくと役立ちます。

wget2(Fedoraなどの既定)での違い

Fedora 40 以降では、wget コマンドの中身が後継の wget2 になっています(Fedora の変更提案ページを今回開いて確認)。よく使うオプションはそのまま通りますが、いくつか違いがあります。Ubuntu 24.04 の wget2 2.1.0 パッケージを作業用ディレクトリに展開して、同じテスト用サーバーで動かしました。

$ wget2 http://127.0.0.1:7890/hello.txt
[0] Downloading 'http://127.0.0.1:7890/hello.txt' ...
Saving 'hello.txt'
HTTP response 200 OK [http://127.0.0.1:7890/hello.txt]

$ wget2 https://127.0.0.1:7891/hello.txt
ERROR: The certificate is NOT trusted. The certificate issuer is unknown. 
Failed to connect: Certificate error
項目 wget 1.21.4(実行済み) wget2 2.1.0(実行済み)
-O / -P / -q / -nv 使える 使える
同名ファイルがあるとき hello.txt.1 で保存 hello.txt.1 で保存
ログの形 --日時-- URL、Saving to: [0] Downloading ...、Saving '...'
404 の終了コード 8 8
証明書エラーの終了コード 5 5
-r -l 2 -np 使える 使える
再帰取得のディレクトリ名(ポート付きURL) 127.0.0.1:7890/ 127.0.0.1/(ポート番号なし)
ftp:// の URL 対応 Failed to parse URI と表示(非対応)
並列ダウンロード なし --max-threads、--chunk-size がある
HTTP/2 なし --http2(既定で有効)とヘルプに記載
--retry-connrefused、--retry-on-http-error ある ヘルプに記載あり

Fedora の変更提案ページでは、wget2 が対応していない機能として FTP と WARC の2つが挙げられています。ログの文言を grep で判定しているスクリプトは、wget2 では表示が変わるため、終了コードで判定する形にしておくと両方で動きます。 どちらが入っているかは wget --version の1行目で確かめられます。

よくある質問

Q. wget でダウンロードしたファイルはどこに保存されますか? A. 何も指定しなければ、コマンドを実行したカレントディレクトリに、URL末尾の名前で保存されます。場所を変えるなら -P ディレクトリ、名前も決めるなら -O パス/ファイル名 です。-P はディレクトリを作ってくれますが、-O は作らないので先に mkdir -p しておきます。

Q. -t でリトライ回数を指定したのに、1回で終わってしまいます。 A. 接続拒否(Connection refused)や 404・503 などのHTTPエラーは、既定ではリトライの対象になりません。接続拒否には --retry-connrefused、HTTPエラーには --retry-on-http-error=503 のように対象を指定します。

Q. wget -r で関係のないページまで取得されます。 A. -np(親ディレクトリに上らない)と -l 数(深さ)を付けて範囲を決めます。今回の検証でも、-np を外すと指定したディレクトリの外にあるページが取得されました。拡張子で絞るなら -A pdf,png を足します。

Q. wget と curl はどちらを使えばよいですか? A. ファイルを保存する、途中から再開する、配下をまとめて取得する、といった用途は wget が短く書けます。API を呼び出す、ヘッダーやメソッドを細かく指定する、応答をパイプで次のコマンドに渡す、といった用途は curl が向いています。

まとめ

  • wget URL でカレントディレクトリに保存。 名前は -O、ディレクトリは -P で決める
  • -P と -O を両方書くと -O が優先される。 複数URLに -O を付けると1ファイルにつながる
  • 再開は -c。 ログに 206 Partial Content と remaining が出れば続きから取得できている
  • リトライは既定20回だが、接続拒否とHTTPエラーは対象外。 --retry-connrefused と --retry-on-http-error で対象に加える
  • 再帰取得は -r -l 数 -np が基本。 -w で間隔を空け、取得範囲と利用規約を確かめてから実行する
  • 証明書エラーは --ca-certificate で信頼する証明書を指定する。 --no-check-certificate は手元での一時的な確認に限る
  • スクリプトでは終了コードで判定する。 4 はネットワーク、5 は証明書、8 はサーバーのエラー応答。wget2 でも同じ値だった

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「wgetコマンドの使い方|保存先・再帰・リトライとcurlの違い」

株式会社RJCでは、wgetやcurlを使ったファイル取得の仕組みを仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?