連載
» 2016年08月09日 05時00分 UPDATE

Dev Basics/Keyword:curl(ファイル転送ツール/ライブラリ)

curlはURL構文を用いてデータを転送するためのオープンソースなコマンドラインツール/ライブラリだ。

[かわさきしんじ,Insider.NET編集部]
「Dev Basics/Keyword」のインデックス

連載目次

curlとは

 curlはURL構文を用いてデータを転送するためのオープンソースなコマンドラインツール/ライブラリ。プロジェクト名は「cURL」(Client for URLs)であり、コマンドラインツール「curl」、ライブラリの「libcurl」がその成果物となる。

 libcurlはHTTP/HTTPSをはじめとする多くのプロトコル、各種の認証方式をサポートし、ファイル転送の中断と再開などの機能を持つライブラリだ。そして、curlはlibcurlの機能を利用して、コマンドラインやスクリプトからデータの転送を行うためのコマンドラインツールである。libcurl/curlは移植性が高く、さまざまなOSプラットフォームで動作する。curlは公式サイトのダウンロードページから入手できる(OSによっては標準でインストールされているかもしれない)。

curlの基本的な使い方

 コマンドラインツールとしてのcurlの最も簡単な使い方は「curl 取得したいデータのURL」を実行する。以下に例を示す。

> curl http://www.atmarkit.co.jp/ait/subtop/dotnet/


curlコマンドの実行例

 上記のコマンドを実行すると、コンソールに取得したデータ(この場合は、本フォーラムのトップページのHTML)が(HTMLテキストベースで)表示される。

curlコマンドの実行画面 curlコマンドの実行画面

 ファイルをカレントディレクトリに保存するには-oオプションまたは-Oオプションを使用する。

  • -oオプション: ダウンロードするファイル名を指定する
  • -Oオプション: 指定したURLのファイル名部分をファイル名として利用する

 以下に例を示す。

# -oオプションの使用例
> curl http://www.atmarkit.co.jp/ait/articles/1608/05/news045.html -o vs15preview3.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 68963    0 68963    0     0   308k      0 --:--:-- --:--:-- --:--:--  308k

# -Oオプションの使用例
> curl http://www.atmarkit.co.jp/ait/articles/1608/05/news045.html -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 68963    0 68963    0     0   307k      0 --:--:-- --:--:-- --:--:--  307k


ファイルをカレントディレクトリに保存

 -oオプションでは指定するファイル名にディレクトリパスを含めてもよい。ただし、このときには--create-dirsオプションを同時に指定する必要がある。以下に例を示す。

> curl http://www.atmarkit.co.jp/ait/articles/1608/05/news045.html -o test\vs15preview3.html --create-dirs


ディレクトリパスを含むファイル名を指定

 これに対して、-Oオプションでは(ファイル名は自動的に決定されることから)ファイルは常にカレントディレクトリに保存される。

 URLには「{}」や「[]」を使って、複数のファイルも指定できる。以下に例を示す。

> curl http://localhost:9080/hoge[1-3].txt -o huga#1.txt


複数ファイルを取得

 見れば分かる通り、これはhoge1.txt〜hoge3.txtの3つのテキストファイルをダウンロードするものだ。ここでは保存先にファイル名として「huga#1.txt」を指定している。この「#1」は上記の「[1-3]」に呼応するもので、保存時に自動的に「1」〜「3」が「huga」に付加されるようになる。なお、curlコマンドでは複数のURLを指定可能だが、ダウンロード自体はシーケンシャルに行われる(ただし、libcurlライブラリは複数のファイルの同時ダウンロードをサポートしている)。

他のコマンドと組み合わせる

 curlで取得できるのはHTMLページだけではない。例えば、Webサーバ上に以下のようなPythonファイル(hello.pyファイル)があったとする。

#!/usr/bin/env python
print('hello from python script')


サンプルのPythonスクリプト

 このファイルを取得して、実行するコマンドラインは次のようになる。

> curl -s http://localhost:9080/hello.py | python -
hello from python script


取得したスクリプトをパイプで実行

 このようにすると、curlコマンドは取得したデータを標準出力に送る。pythonコマンドの直後にある「-」は標準入力の内容を受け付けて、それを実行することを意味している。また、UNIX系統のOSであれば、以下のようなことも可能だ(ここではシェルにbashを使用)。また、ここで指定している-sオプションは「silent」モードを意味し、-oオプション指定時に表示されたプログレスバー(やエラーメッセージ)を表示しないようになる。

$ python -c "$(curl -s http://localhost:9080/hello.py)"
hello from python script


pythonコマンドの引数内にcurlコマンドを埋め込み(Mac OS Xで実行を確認)

 詳細は割愛するが、文字列中の「$()」はコマンド置換を行うbashの機能だ(ここで行っているようなシンプルなものであれば、バッククオートで囲んでもよい)。この場合はcurlコマンドで取得したファイルの内容がpythonコマンドによって実行される。何らかの情報を求めてWebをさまよっていると、curlと他のコマンドを組み合わせた上記のようなコマンドラインを目にすることがたまにあるので、覚えておくとよいだろう。

Wgetとcurl

 curlと同様なコマンドラインベースのファイル転送ツールとしては、GNU Wgetもあるが、curlの公式サイトのFAQページによれば、「curlはWgetのクローンではない。…… 中略 …… 開発時にはcurlがWgetの代わりになるとか、競合になるといった意識はなかった。curlは単発のファイル転送を目的としている」(要約)とある。

 Wgetのようにリンクをたどって再帰的にファイルのダウンロードを行うような機能はcurlにはないが、その一方でサポートしているプロトコルはcurlの方が多いなど、機能面で両者には違いがあることに注意しよう。


 curlはURL構文を用いてデータを転送するためのオープンソースなコマンドラインツール/ライブラリで、主にコマンドラインからWebからデータを取得するために使われる。1行でデータ(ファイル)を取得できる手軽さから、スクリプト言語と組み合わせて、ワンライナーでツールなどをインストールするためにもよく使われている。Windowsユーザーにはあまりなじみがないかもしれないが、手軽で便利なツールだ。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。