LinuxコマンドでWeb上のファイルを取得する

自分用まとめ

# 目次
- [curlとwgetの主な共通点](#curlとwgetの主な共通点)
- [curlとwgetの主な違い](#curlとwgetの主な違い)
- [curlコマンドの使い方](#curlコマンドの使い方)
- [wgetコマンドの使い方](#wgetコマンドの使い方)
- [PDBファイルをダウンロード](#pdbファイルをダウンロード)


# curlとwgetの主な共通点
Webサーバーからコンテンツをダウンロードできるコマンドラインツール


# curlとwgetの主な違い
- `curl`：対応プロトコルの種類が多い(`wget`はHTTP、HTTPS、FTPの3種類だけ)[^1]、複雑なデータ転送やAPIとの連携に適する[^2]
- `wget`：再帰的なダウンロード(ディレクトリ全体を探索して中のファイルを全て取得する)ができる[^1][^3][^4]、バッチ処理による複数のファイルのダウンロードに適する[^2]


# curlコマンドの使い方
基本[^5]：
```
curl -OL [file_url]
```
よく使うオプション[^6]：
```
-o　取得したデータを指定したファイル名で出力する
-O　URLのファイル名でダウンロード
-L　リダイレクトがあったらリダイレクト先の情報を取る
-u　認証に用いるユーザー名およびパスワードを指定する
-v　処理状況の更なる詳細や説明を出力させる
-#　プログレスバーを簡易表示させる
```
サーバー認証つきのURLにログインしてファイルダウンロード[^4]：
```
curl -O -u [username]:[password] [file_url]
```
エラーが発生したときや、curlがどのようなことを行っているのか理解したいとき[^4]：
```
curl -O -v [file_url]
```
進捗をより簡易的に見たい(ダウンロードの進行の％表示だけでいい)とき[^4]：
```
curl -O -# [file_url]
```
同じリモートURLを持つ複数のファイル(e.g. 1.jpg、2.jpg、3.jpg)をダウンロード[^4]：
```
curl -O "https://example.com/images/{1.jpg,2.jpg,3.jpg}"
```
ver.2　同じリモートURLを持つ複数のファイル(e.g. 1.jpg、2.jpg、3.jpg)をダウンロード[^4]：
```
curl -O "https://example.com/files/file[1-3].jpg"
```
異なるURLから複数のファイルをダウンロード[^4]：
```
curl -O [file_url_1] -O [file_url_2]
```
保存先(ファイルパス、ファイル名)を指定してダウンロード[^4]：
```
curl [file_url] > [~/file_path/file_name]
```


# wgetコマンドの使い方
基本：
```
wget [file_url]
```
よく使うオプション[^7]：
```
-r　再帰ダウンロード(すべてのファイルをダウンロード)
-P　取得したデータの保存先を指定する
-O　取得したデータを指定したファイル名で出力する
-c　中断されたダウンロードを続行する
```
ファイルの保存先とファイル名を指定してダウンロード[^1][^8]：
```
wget [file_url] -O [~/file_url/file_name]
```
ファイルの保存先を指定してダウンロード：
```
wget -P [file_path] [file_url]
```
複数のファイルをダウンロード[^3]：
```
複数のファイルのURLを改行して列記したファイルを作成し、保存して閉じる：
vi [url_file.txt]
作成したファイル名を指定してwgetを実行：
wget -i [url_file.txt]
```
同じリモートURLを持つ複数のファイル(e.g. H1001.jpg、H1002.jpg、H1003.jpg)をダウンロード[^7]：
```
wget http://example.com/H100{1..3}.jpg
```
中断されたダウンロードを続行[^3]*：
```
wget -c [file_url]
```
*ダウンロードが中断された場合は、ファイル全体をダウンロードし直すのではなく、以下のように、-cオプションを指定してコマンドを実行するだけでいい[^3]。

中断された複数のファイルのダウンロードを続行[^3]：
```
wget -c -i [url_file.txt]
```
再帰ダウンロード(すべてのファイルをダウンロード)[^1]：
```
wget -r [file_url]
```
取得する階層のレベルを指定して再帰ダウンロード[^1]：
```
wget -r -l 1 [file_url]
```
下位ディレクトリのすべてのファイルをダウンロード[^8]*：
```
wget -r -np [file_url]
```
*-npで上位ディレクトリへは遡らなくなる。

リンクのある外部サイトまで含めてすべてのファイルをダウンロード[^8]*：
```
wget -r -H [file_url]
```
*-Hでリンクのある外部サイトまで取得する。

サーバー認証つきのURLにログインしてファイルダウンロード[^7]：
```
wget --http-user=[username] --http-passwd=[password] [file_url]
```
OAuth認証のかかったサーバはcookiesで対応する[^7]：
```
wget --save-cookies cookies.txt --post-data 'user=foo&password=bar' http://server.com/auth.php
wget --load-cookies cookies.txt -p http://server.com/interesting/article.php
```


# PDBファイルをダウンロード

PDBファイル(PDBID：XXXX)を`curl`コマンドでダウンロード：
```
curl -O https://files.rcsb.org/download/XXXX.pdb
```
PDBファイル(PDBID：XXXX)を`wget`コマンドでダウンロード：
```
wget https://files.rcsb.org/download/XXXX.pdb
```


[^1]:[curl, wget そしてInvoke-WebRequestの違い](https://qiita.com/tatsuki1112/items/dec473f93ca1bda239fb)
[^2]:[🔨curlとwgetの違いはライブラリの有無とか対応プロトコルの豊富さとかいろいろ](https://note.com/rodz/n/nf6478cd5fad8)
[^3]:[「Linux」でブラウザーを使わずにファイルをダウンロードするには](https://japan.zdnet.com/article/35213618/)
[^4]:[cURLでファイルをダウンロードする方法](https://brightdata.jp/blog/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%87%E3%83%BC%E3%82%BF/download-files-with-curl)
[^5]:[LinuxコマンドでWEBからファイルをダウンロードする方法 (wget, curl)](https://weblabo.oscasierra.net/linux-file-download/)
[^6]:[よく使うcurlコマンドのオプション](https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9)
[^7]:[wgetでこういう時はこうする!!](https://qiita.com/hirohiro77/items/b774908436ec032df719)
[^8]:[wgetとcurlの使い分けについて](https://red-full-moon.com/wget-or-curl/)