curlでファイルをダウンロードする方法

curlは、HTTP、HTTPS、FTP、その他数十のプロトコルでファイルをダウンロードするための最も汎用性の高いコマンドラインツールの一つです。単一のAPIレスポンスをファイルに保存する場合でも、シェルスクリプトでバッチダウンロードを自動化する場合でも、curlには対応するフラグがあります。このガイドでは、-o-Oによる基本的なファイル保存から、-C -による中断された転送の再開、--limit-rateによる帯域幅の制御、プログレスバーの表示まで、すべてのダウンロード関連オプションを解説します。各フラグには、わかりやすい説明、一般的な使用パターン、すぐにコピーできる例が含まれています。

ダウンロードフラグ クイックリファレンス

-o

stdoutではなく指定したファイルに出力を書き込む

-O

リモートファイルと同じ名前でファイルに出力を書き込む

-L

HTTP 3xxリダイレクトを自動的に追従

-C -

前回のファイル転送を続行/再開

--limit-rate

転送速度を指定した速度に制限

--max-filesize

指定したサイズより大きいファイルのダウンロードを拒否

-J

Content-Dispositionヘッダーを使用してファイル名を決定

-#

シンプルなプログレスバーとして転送の進捗を表示

-u

サーバー認証用のユーザー名:パスワードを提供

--retry

一時的なエラー時に転送をリトライ(回数)

--retry-delay

リトライ間の待機秒数

-T

ローカルファイルをURLにアップロード(デフォルトはPUT)

--create-dirs

出力保存時に必要なローカルディレクトリを作成

-s

進捗メーターとエラーメッセージを抑制

--output-dir

指定したディレクトリに出力ファイルを保存(curl 7.73以降)

curl -o: 指定したファイル名で保存

動作
-o(または--output)フラグは、curlにレスポンスボディを指定したファイルに保存するよう指示します。これがなければ、curlはレスポンスをstdout(ターミナル)に出力します。任意のファイル名とパスを使用でき、curlはファイルを作成するか既存のファイルを上書きします。
一般的な使い方
-oは、ファイル名を正確に制御したり、特定のディレクトリに保存したい場合に使用します。HTTP、HTTPS、FTP、SFTPなど、すべてのプロトコルで動作します。リダイレクト処理には-L、スクリプトでの静かな動作には-sと組み合わせてください。
$ curl -o report.pdf https://example.com/files/report.pdf

curl -O: リモートのファイル名で保存

動作
-O(または--remote-name)フラグは、URLから抽出したファイル名を使用してダウンロードしたファイルを保存します。例えば、URLが/data.csvで終わる場合、curlはカレントディレクトリにdata.csvというファイルを作成します。
一般的な使い方
-Oは、リモートのファイル名が適切で、名前を変更する必要がない場合に使用します。複数の-Oフラグを渡して、一つのコマンドで複数のファイルをダウンロードできます。注意:URLにファイル名が含まれていない場合(例:/で終わる場合)、curlは失敗します。その場合は-oを使用してください。
$ curl -O https://example.com/files/data.csv

curl -L: リダイレクトを追従

動作
-L(または--location)フラグは、curlにHTTPリダイレクト(301(恒久的な移動)、302(Found)、307、308)を自動的に追従させます。-Lがなければ、curlは実際のコンテンツではなくリダイレクトレスポンス自体を返します。
一般的な使い方
ほとんどのダウンロードURLは少なくとも1回はリダイレクトします(例:HTTPからHTTPS、短縮URLから実際のファイル)。ファイルをダウンロードする際は、常に-L-oまたは-Oと組み合わせてください。デフォルトではcurlは最大50回のリダイレクトに追従します。--max-redirsで変更できます。
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gz

curl -C -: 中断されたダウンロードを再開

動作
-C -(または--continue-at -)フラグは、既存の部分ファイルのサイズを自動的に検出し、中断したところからダウンロードを再開するようcurlに指示します。サーバーがHTTPのRangeヘッダーをサポートしている必要があります。
一般的な使い方
大きなダウンロードがネットワークの問題やタイムアウトで中断された場合、同じコマンドに-C -を追加して再実行するだけです。curlはRange: bytes=OFFSET-ヘッダーを送信し、残りのデータのみをダウンロードします。不安定な接続での大きなファイルに不可欠です。
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: ダウンロード速度を制限

動作
--limit-rateフラグは、ダウンロード(およびアップロード)速度を指定した速度に制限します。サフィックスを受け付けます:kまたはK(KB/秒)、mまたはM(MB/秒)、gまたはG(GB/秒)。
一般的な使い方
--limit-rateは、特に共有接続で大きなファイルをダウンロードする際に帯域幅を飽和させないために使用します。アプリケーションが低速レスポンスをどのように処理するかをテストする場合にも便利です。
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: ファイルが大きすぎる場合に中止

動作
--max-filesizeフラグは、予想されるファイルサイズ(Content-Lengthヘッダーより)が指定した制限を超える場合に転送を中止するようcurlに指示します。サイズにはkMGのようなサフィックスを使用できます。
一般的な使い方
スクリプトで予想外に大きなダウンロードがディスク容量を消費するのを防ぐために使用します。すべてのサーバーがContent-Lengthを送信するわけではありません。その場合、curlはこの制限を適用できず、ダウンロードは通常通り進行します。
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: サーバー提案のファイル名を使用

動作
-J(または--remote-header-name)フラグは、URLからファイル名を導出する代わりに、サーバーのContent-Dispositionヘッダーで指定されたファイル名を使用するようcurlに指示します。これはファイルを意味のある名前で返すダウンロードAPIで一般的です。
一般的な使い方
常に-J-Oと組み合わせてください。URLがAPIエンドポイント(/export?format=csvのような)でも、サーバーがヘッダーで適切なファイル名を返す場合に便利です。セキュリティに関する注意:サーバーがファイル名を制御するため、信頼できるサーバーでのみ使用してください。
$ curl -L -O -J https://example.com/api/export?format=csv

curl -#: プログレスバーを表示

動作
-#(または--progress-bar)フラグは、デフォルトの詳細な進捗メーターをシンプルな###プログレスバーに置き換えます。対話的な使用ではより読みやすくなります。
一般的な使い方
-#は、対話的にダウンロードしていて、すっきりとした進捗表示が欲しい場合に使用します。スクリプトでは、-s(サイレント)またはデフォルトの進捗メーターを推奨します。curlのデフォルト出力はすでに速度、パーセンテージ、残り時間、合計サイズを表示しています。
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

その他のダウンロードオプション

-u

サーバー認証用のユーザー名:パスワードを提供

--retry

一時的なエラー時に転送をリトライ(回数)

--retry-delay

リトライ間の待機秒数

-T

ローカルファイルをURLにアップロード(デフォルトはPUT)

--create-dirs

出力保存時に必要なローカルディレクトリを作成

-s

進捗メーターとエラーメッセージを抑制

--output-dir

指定したディレクトリに出力ファイルを保存(curl 7.73以降)

実践的なダウンロードシナリオ

以下の例は、日常的な開発やスクリプティングで遭遇する一般的なダウンロードタスクを処理するために、複数のフラグを組み合わせています。

複数のファイルを一度にダウンロード

複数の-Oフラグを使用して、一つのコマンドで複数のファイルをダウンロードします。curlは順番に処理します。並列ダウンロードにはxargsまたはGNU parallelを使用してください。

$ curl -O https://example.com/file1.txt -O https://example.com/file2.txt -O https://example.com/file3.txt

FTPサーバーからダウンロード

curlはFTP、FTPS、SFTPをネイティブにサポートしています。認証付きアクセスには-u user:passwordを追加します。リモートのファイル名を保持するには-Oを使用します。

$ curl -u user:pass -o backup.sql ftp://ftp.example.com/db/backup.sql

認証付きダウンロード

Basic Authには-u user:passを使用するか、-HでBearerトークンまたはAPIキーを渡します。完全なダウンロードには-L-oを組み合わせてください。

$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/export

再開とリトライによる信頼性の高いダウンロード

-C -(再開)、--retry(障害時の自動リトライ)、-L(リダイレクト追従)を組み合わせて、ネットワーク中断に耐えるロバストなダウンロードを実現します。

$ curl -C - --retry 5 --retry-delay 10 -L -o largefile.zip https://cdn.example.com/largefile.zip

curlでのダウンロードに関するよくある質問

curl -oとcurl -Oの違いは何ですか?

-o filenameは指定した正確なファイル名でダウンロードを保存します。-OはURLからファイル名を抽出して使用します。カスタム名やパスが必要な場合は-oを、リモートのファイル名でよい場合は-Oを使用してください。

curlが実際のファイルではなく空のファイルやHTMLファイルをダウンロードするのはなぜですか?

URLがHTTPリダイレクト(301または302)を返している可能性があります。デフォルトでは、curlは最終コンテンツではなくリダイレクトレスポンス自体を保存します。リダイレクトを自動的に追従するには-Lを追加してください:curl -L -o file URL

curlで部分的にダウンロードしたファイルを再開するにはどうすればよいですか?

curl -C - -o filename URLを使用します。-C -フラグは既存のファイルサイズを検出し、残りのバイトのみを要求するRangeヘッダーを送信します。これが動作するにはサーバーがrangeリクエストをサポートしている必要があります。

curlでダウンロード速度を制限するにはどうすればよいですか?

--limit-rateに値とサフィックスを指定して使用します:curl --limit-rate 500k -o file URLは速度を500 KB/秒に制限します。サフィックス:k(KB/秒)、M(MB/秒)、G(GB/秒)。

curlで複数のファイルを同時にダウンロードできますか?

はい。複数の-Oフラグを使用します:curl -O URL1 -O URL2 -O URL3。curlは順番にダウンロードします。並列ダウンロードには、URLリストをxargs -P 4 -I {} curl -O {}にパイプしてください。

認証が必要なファイルをダウンロードするにはどうすればよいですか?

HTTP Basic Auth:curl -u user:pass -o file URL。Bearerトークン:curl -H "Authorization: Bearer TOKEN" -o file URL。ヘッダーのAPIキー:curl -H "X-API-Key: KEY" -o file URL

curlでFTPサーバーからファイルをダウンロードするにはどうすればよいですか?

curl -u user:pass -o localfile ftp://host/path/fileを使用します。curlはFTP、FTPS(FTP over TLS)、SFTP(SSH FTP)をネイティブにサポートしています。匿名FTPの場合は-uを省略します。

curlで大きなファイルを確実にダウンロードするにはどうすればよいですか?

-C -(障害時の再開)、--retry 5(自動リトライ)、--retry-delay 10-L(リダイレクト追従)を組み合わせます:curl -C - --retry 5 --retry-delay 10 -L -o file URL。ネットワークの一時的な問題を自動的に処理します。

curlでダウンロード中にプログレスバーを表示するにはどうすればよいですか?

シンプルなプログレスバーにはcurl -# -o file URLを使用します。curlのデフォルト出力はすでに転送速度、パーセンテージ、推定時間を表示しています。スクリプトでは-sですべての出力を抑制します。

curlでダウンロードディレクトリを指定できますか?

curl 7.73以降では、--output-dir /path/to/dir-Oと組み合わせて使用します。古いバージョンでは、-o /path/to/dir/filenameでフルパスを指定します。ディレクトリが存在しない場合は--create-dirsを追加してください。

ファイルのダウンロードにはcurlとwgetのどちらを使うべきですか?

どちらも優れています。wgetは再帰的なウェブサイトミラーリングが簡単で、組み込みのリトライロジックがあります。curlは25以上のプロトコル(HTTP/FTPだけでなく)をサポートし、API呼び出しやスクリプティングに優れ、より多くの認証方式をサポートし、ほぼすべてのOSで利用可能です。

bashスクリプトでcurlを使ってファイルをダウンロードするにはどうすればよいですか?

curl -fsSL -o file URLを使用します:-fはHTTPエラー時にサイレントに失敗(エラーページは保存されない)、-sはサイレント、-Sはサイレントモードでもエラーを表示、-Lはリダイレクト追従。終了コードを確認:if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi