cURLやWgetで実践!コマンドラインによるHTTPファイル転送テクニック


cURLやWgetで実践!コマンドラインによるHTTPファイル転送テクニック

はじめに

現代のコンピューティング環境において、グラフィカルユーザーインターフェース(GUI)は直感的で使いやすく、多くのユーザーにとって標準的な操作方法となっています。Webブラウザでリンクをクリックしてファイルをダウンロードしたり、専用のFTPクライアントでファイルをドラッグ&ドロップしたりするのは、ごく当たり前の光景です。しかし、開発者、システム管理者、あるいは単に作業の効率化を追求するパワーユーザーにとって、コマンドラインインターフェース(CLI)は依然として、そしてこれまで以上に強力な武器であり続けています。

特に、インターネット経由でのファイル転送やAPIとの通信といったタスクにおいて、CLIツールはその真価を発揮します。GUIツールが手動操作を前提とするのに対し、CLIツールはスクリプトによる自動化、リモートサーバーでの実行、他のコマンドとの連携(パイプ処理)など、GUIでは実現が難しい高度な操作を可能にします。サーバーのバックアップを深夜に自動で取得したり、何百ものURLから画像を一度に収集したり、Web APIの動作をテストしたりといった作業は、CLIツールが最も得意とするところです。

この記事では、コマンドラインにおけるHTTPファイル転送の二大巨頭である「cURL」と「Wget」に焦点を当て、その基本的な使い方から、日々の業務や個人のプロジェクトで役立つ実践的なテクニックまでを、詳細な解説と豊富なコマンド例と共に探求していきます。

  • cURL: 「Client for URLs」の略で、その名の通り、ありとあらゆるプロトコルでデータを転送するための万能ツールです。「コマンドラインのアーミーナイフ」とも呼ばれ、単純なファイルダウンロードから複雑なAPIリクエストまで、驚くほど幅広い用途に対応します。
  • Wget: 「World Wide Web Get」の略で、主にHTTP、HTTPS、FTPプロトコルによるファイルのダウンロードに特化した堅牢なツールです。特に、Webサイト全体を再帰的にダウンロード(ミラーリング)する機能や、不安定なネットワーク環境でもダウンロードを確実に完了させるためのリトライ機能に定評があります。

この記事を読み終える頃には、あなたはcURLとWgetを自在に操り、これまで手作業で行っていた多くのファイル転送タスクを自動化し、より高度で効率的なワークフローを構築するための知識とスキルを身につけていることでしょう。さあ、コマンドラインの深遠な世界へ、一緒に旅立ちましょう。

第1章: なぜコマンドラインなのか? – GUIツールとの比較

ファイル転送のために、なぜわざわざ黒い画面にコマンドを打ち込む必要があるのでしょうか?Webブラウザや専用のダウンローダー、FTPクライアントといった優れたGUIツールがあるのに、CLIを選ぶメリットはどこにあるのでしょう。この章では、CLIツールが持つ本質的な利点をGUIツールと比較しながら明らかにしていきます。

GUIツールの限界

GUIツールは直感的で、初心者にも扱いやすいという大きな利点があります。しかし、特定のシナリオ、特に自動化や大規模な処理が求められる場面では、いくつかの限界が見えてきます。

  1. 繰り返しの手作業: 100個のファイルがリストされたWebページから、すべてのファイルをダウンロードする場合を考えてみましょう。GUIでは、100回リンクを右クリックして「名前を付けて保存」を選択するか、ダウンロードマネージャーに一つずつURLを登録する必要があります。これは非常に退屈で、時間のかかる作業です。
  2. リソース消費: GUIアプリケーションは、ウィンドウやボタン、メニューなどのグラフィカルな要素を描画するために、相応のメモリやCPUリソースを消費します。バックグラウンドで静かにタスクを実行させたい場合には、オーバースペックになることがあります。
  3. サーバー環境での利用困難: 多くのサーバーは、セキュリティやリソース節約のために、GUI環境(デスクトップ環境)を持たずに運用されています。SSHでリモート接続して操作するのが基本となるため、GUIツールはそもそも利用できません。サーバー上で直接ファイルをダウンロードしたり、他のサーバーとデータをやり取りしたりするには、CLIツールが必須となります。

CLIツールの圧倒的な利点

これに対し、cURLやWgetのようなCLIツールは、これらの限界を克服し、さらに多くの可能性を切り拓きます。

  1. スクリプティングと自動化: CLIツールの最大の強みは、シェルスクリプト(Bash, Zshなど)に簡単に組み込める点です。これにより、複雑なタスクの自動化が可能になります。

    • 定期実行: cronのようなスケジューラと組み合わせることで、「毎日深夜3時にWebサイトのバックアップを取得する」「5分ごとにAPIを叩いてサーバーの状態を監視する」といったタスクを全自動で実行できます。
    • 一括処理: ファイルに書かれたURLリストを読み込み、ループ処理ですべてのファイルをダウンロードするスクリプトを数行で記述できます。前述の100個のファイルをダウンロードする作業も、CLIなら一瞬です。
  2. リモート操作との親和性: SSH経由でサーバーにログインすれば、ローカルマシンと全く同じようにCLIツールを操作できます。これにより、リモートサーバー上でのデータ取得、サーバー間でのファイル転送、デプロイスクリプト内でのライブラリダウンロードなどが容易になります。

  3. パイプとリダイレクトによる連携: Unix/Linuxの哲学である「小さなプログラムを組み合わせて、より大きな仕事をする」を体現するのがパイプ (|) です。例えば、あるコマンドの出力をcURLに渡してPOSTデータとして送信したり、cURLで取得したHTMLコンテンツをgrepsedawkといったテキスト処理ツールに渡して必要な情報だけを抽出したりすることが可能です。
    bash
    # Webページから特定のパターンに一致する行を抽出し、ファイルに保存
    curl https://example.com | grep "important_data" > result.txt

  4. 軽量さと高速性: GUIを持たないCLIツールは、起動が速く、メモリ消費も最小限です。必要な処理だけを効率的に行うため、パフォーマンスが非常に優れています。特にリソースが限られた環境(古いPC、Raspberry Pi、クラウドの最小インスタンスなど)では、この差は顕著になります。

  5. 再現性と共有の容易さ: 実行したコマンドは、そのまま手順書となります。コマンドの履歴をコピー&ペーストしたり、スクリプトファイルとして保存したりすれば、誰でも、いつでも同じ操作を正確に再現できます。これは、チームでの開発やサーバー設定のドキュメンテーションにおいて非常に価値があります。

GUIの利便性を否定するものではありませんが、定型的、大規模、あるいは自動化されたファイル転送タスクにおいては、CLIツールが提供するパワーと柔軟性は比類なきものです。次の章からは、この強力なツール「cURL」と「Wget」の具体的な使い方を学んでいきましょう。

第2章: cURL – スイスアーミーナイフと呼ばれる多機能ツール

cURLは、データ転送における「スイスアーミーナイフ」と称されるほど、非常に多機能で汎用性の高いツールです。その名の由来である「Client for URLs」が示す通り、URLを使ってクライアントとしてデータを送受信することに特化しています。

cURLとは?

cURLの最大の特徴は、対応プロトコルの豊富さにあります。HTTP/HTTPSはもちろんのこと、FTP, FTPS, SCP, SFTP, SMTP, POP3, IMAP, LDAPなど、現代のインターネットで使われる主要なプロトコルのほとんどをカバーしています。このため、cURLは単なるファイルダウンローダーにとどまらず、APIテスト、メール送信、サーバーへのファイルアップロードなど、ネットワーク通信に関わるあらゆるタスクに利用できます。

また、cURLはコマンドラインツールとしてだけでなく、libcurlというライブラリとしても提供されており、PHP, Python, Ruby, Goなど、多くのプログラミング言語から利用されています。あなたが普段使っているプログラムの内部で、実はlibcurlが活躍しているかもしれません。

基本的な使い方

cURLの最も基本的な構文は curl [options] [URL] です。

1. コンテンツを標準出力に表示
引数にURLを指定するだけで、そのURLのコンテンツ(HTML、JSONなど)をターミナルの画面(標準出力)に表示します。
“`bash

example.comのHTMLソースコードを表示

curl https://example.com
“`

2. ファイルに保存 (-o, -O)
多くの場合、コンテンツはファイルとして保存したいでしょう。そのためのオプションが -o-O です。

  • -o, --output <file>: 保存するファイル名を自分で指定します。
    bash
    # example.comのコンテンツを page.html という名前で保存
    curl -o page.html https://example.com
  • -O, --remote-name: URLの末尾にあるファイル名をそのまま利用して保存します。
    bash
    # サーバー上のファイル名 (latest.tar.gz) でカレントディレクトリに保存
    curl -O https://github.com/git/git/archive/refs/tags/v2.37.2.tar.gz

ダウンロードの制御

cURLには、ダウンロード処理を細かく制御するための便利なオプションがあります。

1. リダイレクトを追跡 (-L)
Webサイトによっては、アクセスしたURLが別のURLにリダイレクトされることがあります(HTTPステータスコード 301, 302 など)。デフォルトではcURLはリダイレクトを追跡しませんが、-L (--location) オプションを付けることで、最終的なリダイレクト先まで追跡してコンテンツを取得します。
“`bash

短縮URLなど、リダイレクトが発生する場合に必須

curl -L https://t.co/example
“`

2. ダウンロードの再開(レジューム) (-C -)
巨大なファイルのダウンロード中にネットワークが切断されてしまった場合、最初からやり直すのは大変です。-C - (--continue-at -) を使うと、cURLはダウンロードを中断した箇所から再開しようと試みます。
“`bash

巨大なISOイメージのダウンロードを再開

curl -C – -O http://releases.ubuntu.com/22.04/ubuntu-22.04.1-desktop-amd64.iso
“`
このコマンドを再度実行すると、すでにダウンロード済みの部分をスキップして、残りの部分だけをダウンロードします。

3. 帯域制限 (–limit-rate)
他のネットワーク利用者に迷惑をかけないよう、ダウンロード速度を制限したい場合があります。--limit-rate で速度を指定できます(k: キロバイト, m: メガバイト)。
“`bash

ダウンロード速度を1MB/sに制限

curl –limit-rate 1m -O https://example.com/large-file.zip
“`

HTTPリクエストのカスタマイズ

cURLが「APIテストツール」として絶大な人気を誇る理由は、HTTPリクエストを自由自在に組み立てられる点にあります。

1. HTTPメソッドの指定 (-X)
GET以外のメソッド(POST, PUT, DELETEなど)を使いたい場合は、-X (--request) オプションで指定します。
“`bash

DELETEメソッドでリソースを削除するAPIを叩く

curl -X DELETE https://api.example.com/items/123
“`

2. カスタムヘッダーの追加 (-H)
APIキーの指定やコンテントタイプ(Content-Type)の明示など、カスタムHTTPヘッダーを追加するには -H (--header) を使います。
“`bash

JSONデータを送信することを明示し、認証トークンをヘッダーに含める

curl -X POST \
-H “Content-Type: application/json” \
-H “Authorization: Bearer YOUR_ACCESS_TOKEN” \
https://api.example.com/data
“`

3. POSTデータの送信 (-d, –data)
POSTリクエストでデータを送信するには -d (--data) が最も一般的です。

  • 単純なキーバリュー形式:
    bash
    # フォームデータを送信
    curl -d "name=Taro&[email protected]" https://example.com/form
  • JSONデータの送信:
    -H "Content-Type: application/json" と組み合わせるのが一般的です。
    bash
    curl -X POST \
    -H "Content-Type: application/json" \
    -d '{"username": "testuser", "score": 100}' \
    https://api.example.com/scores
  • ファイルの内容をデータとして送信:
    @ の後にファイル名を指定すると、そのファイルの内容がデータとして送信されます。
    bash
    # request.jsonファイルの内容をPOSTデータとして送信
    curl -X POST -H "Content-Type: application/json" -d @request.json https://api.example.com/scores

4. ファイルのアップロード (-F)
HTMLフォームの <input type="file"> のように、multipart/form-data 形式でファイルをアップロードするには -F (--form) を使います。
“`bash

profile.jpg というファイルを user_image というフィールド名でアップロード

curl -F “[email protected]” https://example.com/upload
“`

認証とセキュリティ

1. Basic認証 (-u)
ユーザー名とパスワードが必要なBasic認証のかかったサイトにアクセスするには -u (--user) を使います。
“`bash

user:password の形式で指定

curl -u admin:P@ssw0rd123 https://admin.example.com/
“`
パスワードを省略すると、プロンプトで安全に入力できます。

2. SSL証明書の検証をスキップ (-k)
開発環境などで自己署名証明書(オレオレ証明書)を使っているサーバーにアクセスすると、cURLはデフォルトでエラーを出します。これを一時的に無視するのが -k (--insecure) オプションです。
注意: このオプションは中間者攻撃のリスクを高めるため、信頼できるネットワークや開発目的以外での使用は絶対に避けてください。
bash
curl -k https://localhost:8443/

デバッグと詳細表示

APIとの通信がうまくいかない時、何が起こっているのかを正確に把握する必要があります。

1. 詳細な通信情報を表示 (-v)
-v (--verbose) を使うと、cURLが行っている通信の全プロセス(IPアドレスへの接続、SSLハンドシェイク、送受信したヘッダーなど)が詳細に表示されます。デバッグの第一歩として非常に有用です。
“`bash

リクエストとレスポンスのヘッダーを含め、詳細情報を表示

curl -v https://example.com
“`

2. レスポンスヘッダーのみ表示 (-I)
-I (--head) オプションは、HTTPのHEADメソッドを送信します。これにより、コンテンツ本体(ボディ)をダウンロードせず、レスポンスヘッダー(HTTPステータスコード、Content-Type、更新日時など)だけを取得できます。サーバーの状態を確認したり、リダイレクト先を調べたりするのに便利です。
“`bash

example.comのレスポンスヘッダーだけを取得

curl -I https://example.com
出力例:
HTTP/2 200
content-type: text/html; charset=UTF-8

“`

実践的なcURLレシピ集

レシピ1: JSON APIの動作確認
jq コマンドと組み合わせることで、JSONレスポンスを整形して見やすく表示できます。
“`bash

GitHub APIでcURLリポジトリの情報を取得し、jqで整形して表示

curl -s https://api.github.com/repos/curl/curl | jq .
``-s(–silent`) は進捗表示を消し、純粋なデータだけを出力させるために使います。

レシピ2: Webサイトのヘルスチェック
-o /dev/null でダウンロードしたコンテンツを捨て、-s で進捗を消し、-w (--write-out) で特定の情報だけを出力させます。これでHTTPステータスコードだけを確認できます。
“`bash

ステータスコードが200ならOK

STATUS_CODE=$(curl -s -o /dev/null -w “%{http_code}” https://example.com)
if [ “$STATUS_CODE” -eq 200 ]; then
echo “Site is up and running.”
else
echo “Site is down! Status code: $STATUS_CODE”
fi
“`

レシピ3: Cookieを使ったセッション維持
ログインが必要なサイトからデータを取得する場合、まずログインしてCookieを取得し、その後のリクエストでCookieを送信します。
“`bash

1. ログインしてセッションCookieをcookie.txtに保存

curl -c cookie.txt -d “username=myuser&password=mypass” https://example.com/login

2. 保存したCookieを使って、ログイン後のページにアクセス

curl -b cookie.txt https://example.com/mypage
``
*
-c, –cookie-jar : レスポンスのCookieを指定したファイルに保存。
*
-b, –cookie `: 指定したファイルや文字列からCookieを読み込んで送信。

cURLはここで紹介した以外にも無数のオプションと機能を備えています。まさに、コマンドラインにおけるネットワーク通信のすべてを担うことができる、強力無比なツールと言えるでしょう。

第3章: Wget – 頼れるダウンロード専門家

cURLが多機能なアーミーナイフだとすれば、Wgetは「ダウンロード」という一つの仕事をとことん極めた、信頼性の高い専門道具です。その主な目的は、ネットワーク経由でファイルを堅牢かつ効率的に取得することにあります。

Wgetとは?

Wget(World Wide Web Get)は、非インタラクティブな(つまり、ユーザーの操作なしで動作する)ネットワークダウンローダーです。バックグラウンドでの実行や、不安定なネットワーク環境下での動作を前提に設計されており、cURLとは異なる哲学を持っています。

Wgetの最大の特徴は以下の通りです。
* 再帰的ダウンロード: 指定したURLからリンクをたどり、Webサイト全体や特定のディレクトリ構造を丸ごとダウンロードする機能が非常に強力です。
* 堅牢なレジューム機能: ネットワーク接続が途切れても、自動的に再接続し、ダウンロードを中断した箇所から再開します。この機能はデフォルトで有効に近いです。
* シンプルさ: 主な用途がダウンロードに絞られているため、基本的な使い方は非常にシンプルです。

基本的な使い方

Wgetの基本的な構文は wget [option]... [URL]... です。

1. ファイルのダウンロード
最もシンプルな使い方は、cURLと同様にURLを指定するだけです。cURLが標準出力に表示するのに対し、WgetはデフォルトでURLのファイル名でカレントディレクトリにファイルを保存します。
“`bash

URLのファイル名 (v2.37.2.tar.gz) で自動的に保存される

wget https://github.com/git/git/archive/refs/tags/v2.37.2.tar.gz
“`
この動作の違いは、両ツールの設計思想を象徴しています。cURLは「データ転送」、Wgetは「ファイル取得」が主目的です。

2. 出力ファイル名の指定 (-O)
保存するファイル名を変更したい場合は、-O (大文字のO) オプションを使います。(cURLの -o (小文字) と同じ機能です)
“`bash

git.tar.gz という名前で保存

wget -O git.tar.gz https://github.com/git/git/archive/refs/tags/v2.37.2.tar.gz
“`

ダウンロードの強力な機能

Wgetの真価は、その高度なダウンロード機能にあります。

1. ダウンロードの自動再開 (-c)
Wgetのキラー機能の一つが -c (--continue) です。ダウンロードが中断された場合、同じコマンドを -c 付きで再実行するだけで、自動的に中断箇所から再開します。巨大なファイルをダウンロードする際には、お守りのように付けておくと安心です。
“`bash

巨大なファイルのダウンロード。中断してもこのコマンドを再度実行すればOK

wget -c http://releases.ubuntu.com/22.04/ubuntu-22.04.1-desktop-amd64.iso
“`

2. サイトの再帰的ダウンロード(ミラーリング) (-r, -m)
Webサイトのコンテンツを丸ごとローカルに保存したい場合、Wgetの独壇場です。

  • -r, --recursive: 指定したURLからリンクを再帰的にたどってダウンロードします。
  • -l, --level <depth>: たどる階層の深さを指定します(デフォルトは5)。
  • -m, --mirror: ミラーリングに最適化されたオプションの集合です。-r -N -l inf --no-remove-listing と同等で、タイムスタンプを比較して更新されたファイルのみをダウンロードし、階層の制限なくたどります。サイトの完全なバックアップを作成するのに最適です。
    bash
    # example.comをミラーリング(バックアップ)
    wget -m https://example.com/

    実行すると、example.com というディレクトリが作成され、その中にサイトのディレクトリ構造が再現されます。

3. ページの表示に必要な全リソースをダウンロード (-p)
特定のHTMLページを、画像、CSS、JavaScriptファイルを含めて完全に表示可能な形で保存したい場合、-p (--page-requisites) を使います。
“`bash

index.html と、その表示に必要な画像やCSSなどをまとめてダウンロード

wget -p https://example.com/index.html
“`

4. ダウンロード対象のフィルタリング (-A, -R)
再帰的ダウンロードと組み合わせることで、特定の種類のファイルだけを収集できます。

  • -A, --accept <list>: ダウンロードを許可する拡張子をカンマ区切りで指定します。
  • -R, --reject <list>: ダウンロードを拒否する拡張子をカンマ区切りで指定します。

“`bash

あるサイトからPDFファイルとJPGファイルだけを再帰的にダウンロード

wget -r -l 2 -A pdf,jpg https://example.com/documents/
“`

5. 親ディレクトリを遡らない (-np)
再帰的ダウンロードの際、意図せずサイト全体をダウンロードしてしまうことを防ぐため、-np (--no-parent) を使うと、指定したURLより上の階層には移動しなくなります。
“`bash

/documents/ ディレクトリとその配下のみをダウンロード対象とする

wget -r -np https://example.com/archives/documents/
“`

ネットワークとパフォーマンスの制御

1. 帯域制限 (–limit-rate)
cURLと同様に、ダウンロード速度を制限できます。
“`bash

速度を500KB/sに制限

wget –limit-rate=500k http://example.com/large-file.zip
“`

2. リトライ回数とタイムアウト (-t, -T)
* -t, --tries=<number>: 失敗した場合のリトライ回数を指定します(0で無限リトライ)。
* -T, --timeout=<seconds>: ネットワークのタイムアウト時間を秒で指定します。

“`bash

ネットワークが不安定な場合、無限にリトライし、タイムアウトを60秒に設定

wget -t 0 -T 60 -c http://example.com/very-large-file.mkv
“`

3. バックグラウンドでの実行 (-b)
-b (--background) を使うと、Wgetは即座にバックグラウンドプロセスとなり、ターミナルを閉じてもダウンロードを続けます。進捗は wget-log というファイルに記録されます。
“`bash

巨大なファイルのダウンロードをバックグラウンドで開始

wget -b -c http://example.com/very-large-file.mkv

ログで進捗を確認

tail -f wget-log
“`

実践的なWgetレシピ集

レシピ1: Webサイトのオフラインバックアップ作成
ミラーリングオプションに加えて、ローカルでリンクが正しく機能するように変換する -k (--convert-links) と、ページのリソースをまとめる -p を組み合わせます。
“`bash

サイトをダウンロードし、オフラインで閲覧できるようにリンクを調整

wget -m -k -p https://www.gnu.org/software/wget/
“`

レシピ2: URLリストからファイルを一括ダウンロード
urls.txt というファイルにダウンロードしたいURLを1行ずつ記述しておき、-i (--input-file) オプションで読み込ませます。
“`bash

urls.txt の内容:

https://example.com/file1.zip

https://example.com/file2.zip

https://example.com/file3.zip

ファイルを読み込んで一括ダウンロード

wget -i urls.txt
“`

レシピ3: 特定の種類のファイルをサイトから根こそぎ集める
例えば、あるWebサイトのすべての階層から、すべてのPDFファイルを集めたい場合、以下のようにします。
“`bash

-r: 再帰的に, -l inf: 階層無制限, -np: 親を辿らない

-A .pdf: 拡張子が.pdfのファイルのみ受け入れる

wget -r -l inf -np -A .pdf http://example.com/docs/
“`

Wgetは、その堅牢性と再帰的ダウンロード機能により、大量のファイルを体系的に、そして確実にダウンロードするタスクにおいて、他の追随を許さない強力なツールです。

第4章: cURL vs Wget – どちらをいつ使うべきか?

ここまで、cURLとWgetのそれぞれの特徴と使い方を見てきました。どちらも強力なツールですが、得意なこと、不得意なことがあります。この章では、両者を直接比較し、どのような場合にどちらを選択すべきかのガイドラインを示します。

機能比較表

機能 cURL (Client for URLs) Wget (World Wide Web Get)
主な目的 データ転送(汎用、アップ/ダウンロード) ファイルダウンロード(特に一括、再帰的)
対応プロトコル 非常に多い (HTTP, FTP, SMTP, IMAP等) 主に HTTP, HTTPS, FTP
再帰的ダウンロード 非対応 (外部スクリプトとの連携が必要) 得意 ( -r, -m オプション)
ライブラリとして libcurl (非常に強力で広く使われる) 限定的
HTTPメソッド 全メソッド対応 (GET, POST, PUT, DELETE等) 限定的 (GETが主、--post-data等でPOSTも可)
標準出力への出力 デフォルト (パイプ処理に最適) -O - で可能だが、ファイル保存が基本
レジューム機能 -C - で対応 -c で強力に対応 (より堅牢)
インストール状況 macOS/Windows 10以降に標準搭載 多くのLinuxディストリビューションに標準搭載
設計思想 ツールボックス (他のツールと連携) 自己完結型 (単体で多くの仕事をこなす)

ユースケース別選択ガイド

この比較を踏まえて、具体的なシナリオごとに最適なツールを選んでみましょう。

✅ cURLを選ぶべき時

  • REST APIのテスト・操作:
    JSONデータをPOSTしたり、PUTで更新したり、DELETEで削除したり、カスタムヘッダー(認証トークンなど)を付けたりするなら、cURLの圧勝です。 -X, -d, -H などのオプションがこのために作られています。
  • スクリプトへの組み込みとパイプ処理:
    ダウンロードしたコンテンツを直接 grepjq に渡して処理したい場合、デフォルトで標準出力に書き出すcURLが最適です。
  • ファイルアップロード:
    FTPやHTTPフォーム経由でファイルをサーバーにアップロードするタスクは、cURLの得意分野です (-F, -T)。
  • HTTP以外のプロトコル利用:
    SMTPでメールを送信したり、IMAPでメールを取得したりといった、HTTP/FTP以外のプロトコルを扱う必要がある場合は、cURL一択です。
  • ちょっとした動作確認:
    Webサーバーのヘッダーを確認する (-I)、リダイレクト先を調べる (-L -v) といった、素早い確認作業にも手軽で便利です。

✅ Wgetを選ぶべき時

  • Webサイト全体のミラーリング・バックアップ:
    Webサイトを丸ごとローカルに保存したいなら、Wgetの -m オプションに勝るものはありません。これはWgetの代名詞的な機能です。
  • 不安定なネットワークでの巨大ファイルのダウンロード:
    Wgetの -c オプションと自動リトライ機能は、接続が頻繁に切れるような環境でも、粘り強くダウンロードを完了させてくれます。
  • 特定の種類のファイルをサイトから一括ダウンロード:
    サイト内を巡回して、画像ファイル (.jpg, .png) やドキュメント (.pdf) だけを根こそぎダウンロードしたい場合、-r -A の組み合わせが非常に強力です。
  • バックグラウンドでの長時間ダウンロード:
    -b オプションを使えば、コマンドを実行してすぐにターミナルを解放できます。サーバー上で数時間かかるようなダウンロードを実行するのに最適です。

⚖️ どちらでも良い時

  • 単一のファイルの単純なダウンロード:
    curl -O [URL]wget [URL] は、ほぼ同じ結果になります。どちらがインストールされているか、あるいはどちらのコマンドに慣れているかで選んで問題ありません。

結論として、API操作やスクリプト連携など、「データ」を柔軟に「転送」したい場合は cURL を、Webサイトのコンテンツなど、「ファイル」を堅牢に「取得」したい場合は Wget を選ぶのが良いでしょう。両者の特性を理解し、タスクに応じて適切に使い分けることが、コマンドラインマスターへの道です。

第5章: 高度なテクニックと応用例

cURLとWgetの基本をマスターしたら、次はシェルスクリプトとの連携や、より高度なオプションを駆使して、その能力を最大限に引き出してみましょう。

シェルスクリプトとの連携

1. ループ処理で連番ファイルをダウンロード
ウェブサイト上に file01.zip, file02.zip, …, file50.zip のような連番ファイルがある場合、ループを使って一括ダウンロードできます。

“`bash

Bashのブレース展開を利用

01から50までの連番URLからファイルをダウンロード

curl -O https://example.com/files/file[01-50].zip

forループを使う場合 (より柔軟)

for i in $(seq -w 1 50); do
wget “https://example.com/files/file${i}.zip”
# ダウンロードの間隔を空ける (サーバーに負荷をかけすぎないため)
sleep 1
done
``seq -w01,02` のようにゼロ埋めされた数値を生成します。

2. URLリストから一括ダウンロード (xargs)
urls.txt にダウンロードしたいURLのリストがある場合、xargs コマンドと組み合わせると、並列ダウンロードも可能です。

“`bash

urls.txt の各行を引数としてwgetを実行

cat urls.txt | xargs wget

4プロセスで並列ダウンロードを実行 (高速化)

cat urls.txt | xargs -n 1 -P 4 wget
``
*
-n 1:urls.txtから一度に1行ずつ引数を渡す。
*
-P 4`: 最大4プロセスを同時に実行する。

プロキシ経由での利用

会社のネットワーク内など、プロキシサーバーを経由しないと外部にアクセスできない環境では、プロキシ設定が必要です。

  • cURL: -x オプションで指定します。
    bash
    curl -x http://proxy.example.com:8080 https://google.com
  • Wget: 環境変数を設定するのが一般的です。この設定はcURLを含む多くのコマンドラインツールで共有されます。
    “`bash
    # 環境変数を設定
    export http_proxy=”http://proxy.example.com:8080″
    export https_proxy=”http://proxy.example.com:8080″

    これでwgetやcurlは自動的にプロキシを経由する

    wget https://google.com
    “`

ユーザーエージェントの偽装

サーバーによっては、プログラムからのアクセス(デフォルトのcURLやWgetのユーザーエージェント)をブロックすることがあります。その場合、一般的なWebブラウザからのアクセスであるかのように見せかける「ユーザーエージェントの偽装」が有効です。

  • cURL: -A オプションを使います。
    bash
    curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36" https://example.com
  • Wget: -U オプションを使います。
    bash
    wget -U "Mozilla/5.0 ..." https://example.com

cURLの強力な機能: 変数とフォーマット出力 (-w)

cURLの -w (--write-out) オプションは、転送完了後に様々な情報を指定したフォーマットで出力できる非常に強力な機能です。スクリプトによる自動監視などで絶大な効果を発揮します。

“`bash

接続時間、合計時間、HTTPステータスコード、ダウンロードサイズを出力

curl -s -o /dev/null -w ”
Connect Time: %{time_connect}s
Total Time: %{time_total}s
Status Code: %{http_code}
Size: %{size_download} bytes
” https://example.com
出力例:
Connect Time: 0.052s
Total Time: 0.125s
Status Code: 200
Size: 1256 bytes
“`
この機能を使えば、APIのレスポンスタイムを計測したり、ダウンロードが成功したか(ステータスコードが200か)を簡単に判定したりできます。

Wgetの設定ファイル (.wgetrc)

毎回同じオプション(プロキシ設定、ユーザーエージェント、リトライ回数など)を入力するのが面倒な場合、設定ファイルに記述しておくことができます。ホームディレクトリに .wgetrc というファイルを作成します。

~/.wgetrc の例:
“`

デフォルトでレジュームを有効にする

continue = on

リトライ回数を10回に設定

tries = 10

ユーザーエージェントを偽装

user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64)

帯域を1MB/sに制限

limit_rate = 1m

SSL証明書の検証をスキップ (注意して使用)

check_certificate = off

``
このファイルがあれば、単に
wget [URL]` と実行するだけで、これらのオプションが自動的に適用されます。

まとめ

この記事では、コマンドラインによるHTTPファイル転送の世界を、二つの偉大なツール、cURLとWgetを通して探求してきました。

  • cURLは、その圧倒的な多機能性とプロトコル対応範囲により、データ転送のあらゆる側面をカバーする「スイスアーミーナイフ」です。APIとの対話、スクリプトへの組み込み、詳細なデバッグなど、柔軟性が求められる場面でその力を発揮します。
  • Wgetは、ファイルダウンロード、特にWebサイトのミラーリングや不安定な環境での大容量ファイルの取得というタスクに特化した「専門家」です。その堅牢性と使いやすさは、大量のファイルを確実に手に入れたい場合に頼りになります。

私たちは、単純なファイルダウンロードから始め、リダイレクトの追跡、ダウンロードの再開、HTTPリクエストの完全なカスタマイズ、サイト全体のミラーリング、そしてシェルスクリプトとの高度な連携に至るまで、数多くのテクニックを学んできました。

GUIの直感的な操作も素晴らしいものですが、CLIツールを習得することは、あなたの生産性を飛躍的に向上させ、これまで不可能だと思っていたタスクの自動化を可能にします。定型的な作業をスクリプトに任せることで、あなたはより創造的で重要な仕事に集中できるようになるでしょう。

ここで紹介した機能は、cURLとWgetが持つ能力のほんの一部に過ぎません。さらなる知識を求めるなら、ターミナルで man curlman wget と入力してみてください。そこには、あなたの探求心をくすぐる、さらに多くのオプションと可能性が広がっています。

さあ、今日からあなたのワークフローにcURLとWgetを取り入れ、コマンドラインの持つ真の力を解放しましょう。Happy CULRing and Wgetting

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール