京橋のバイオインフォマティシャンの日常

データ分析、コマンドライン、プログラミングについての技術資料・自己アップデート・悩み事などをまとめています。最近、ディープラーニング関連のR言語の資料をまとめるべく注力してます。

Mac版wgetでGoogle DriveからファイルをダウンロードするTips〜フォルダの共通設定からwgetコマンド実行まで〜

最近、データを置いておくのに良さそうな公共リポジトリが見つからず、 やっぱ、Google Driveを使うのが無難かなと思いだしたので、その関連記事を書いてみた。

今回、Google Driveをデータリポジトリとして、データを公開して、 コマンドラインでそのデータをダウンロードするやり方を扱うことにする。

また、後半部分で、wgetコマンドを使用するので、以前の記事を参考にセットアップのこと。

skume.hatenablog.com

もくじ

テストファイルの生成

はじめに、test01.txttest02.txtという、2つのテストファイルを用意してみた。

test01.txt は、手動で作った、15B(バイト)のテキストファイルである。

f:id:skume:20201123024125p:plain:w300

test02.txt は、seq 20000000 > test02.txtのコマンドで作成した、232MBのテキストファイルである。

f:id:skume:20201123024128p:plain:w300

このファイル生成の詳細は、過去の記事を参考のこと。

skume.hatenablog.com

Google Driveに任意のフォルダ(例えば、TESTフォルダ)を作成しておいて、これらのファイルをアップロードする。

Google Driveの共通フォルダ設定・ファイルアップロード

次に、Google Driveにあるフォルダの共通設定を行う。

今回、TESTというフォルダを作成したので、そこで、フォルダタブの共有をクリックする。

f:id:skume:20201123024133p:plain:w300

次に、「リンクの取得」の変更に進んで、

f:id:skume:20201123024137p:plain:w300

フォルダの共通設定を「リンクを知っている全員」を選択して、閲覧制限をなくす。

f:id:skume:20201123024141p:plain:w300

こうやってフォルダ設定することで、フォルダ内のファイルも閲覧制限なく共通される。

ファイルURLの取得・書き換え

次に、test01.txttest02.txtの「リンクを取得」で各URLを取得する。

f:id:skume:20201123024144p:plain:w300

リンクのコピーをしてみると、以下のURLが得られた。

# test01.txt
https://drive.google.com/file/d/1jlDWA1kTEks0B20U4yLQMvF2QPiS74WJ/view?usp=sharing

# test02.txt
https://drive.google.com/file/d/17UjI9766dZFmWRjqngzMjcFyOSMrDXiy/view?usp=sharing

このままだと、ダウンロードURLとしては使えないので、以下のような形にURLを書き換える。

https://drive.google.com/file/d/{ID}/view?usp=sharing
↓↓↓↓↓
https://drive.google.com/uc?export=view&id={ID}

このとき、 test01.txtのIDは1jlDWA1kTEks0B20U4yLQMvF2QPiS74WJtest02.txtのIDは17UjI9766dZFmWRjqngzMjcFyOSMrDXiy となる。

したがって、ファイルのダウンロードURLは

# test01.txtのダウンロードURL
https://drive.google.com/uc?export=view&id=1jlDWA1kTEks0B20U4yLQMvF2QPiS74WJ

# test02.txtのダウンロードURL
https://drive.google.com/uc?export=view&id=17UjI9766dZFmWRjqngzMjcFyOSMrDXiy

となる。

wgetでのファイル・ダウンロード

1. 小さいファイルの場合

小さいファイルの場合は、シンプルなコマンドでダウンロードが実行できる。

今回のwgetの基本形は、wget "ダウンロードURL" -O "保存ファイル名"を用いる。

ダウンロードURLは、" (ダブルクォーテーション)を入れないと、エラーとなるので注意。

また、保存ファイル名を指定しないと変なファイル名になる。

そのため、オプションで「-O」を使用して、ファイル名を指定してダウンロードするのが良い。

では、ターミナルを起動して、以下を実行してみる。

wget "http://drive.google.com/uc?export=view&id=1Jp0nBzquJCK8oWNXP7k9GqIDRMt2xyKY" -O "test01.txt"

#OR

wget --no-check-certificate "http://drive.google.com/uc?export=view&id=1Jp0nBzquJCK8oWNXP7k9GqIDRMt2xyKY" -O "test01.txt"

これで、test01.txtがローカルディレクトリにダウンロードできているはず。

2. 大きいファイル(100MB以上)の場合

大きなファイル*1のダウンロード時には、「 Google でスキャン可能な上限サイズを超えています。 このファイルはパソコンに損害を与える可能性があります。」とかのメッセージが表示される。

Webのインターフェイスなら、それをキャンセルあるいはOKして、ダウンロードを実行する必要がある。

要するに、それと同じことを、コマンドラインで実施することになる。

そのやり方については、Guy Smoilovskyさんが関連のスクリプトを書いてくれてたので、それを参考にしてみる。

以下のコマンドでは、S1にダウンロードURLのID、S2に保存ファイル名を代入して、実行する。

また、行の末尾に;を入れることで、続けて実行が行われる。

S1="17UjI9766dZFmWRjqngzMjcFyOSMrDXiy";
S2="test02.txt";
CONFIRM=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://drive.google.com/uc?export=download&id=$S1" -O- | sed -En 's/.*confirm=([0-9A-Za-z_]+).*/\1/p');
wget --load-cookies /tmp/cookies.txt "https://drive.google.com/uc?export=download&confirm=$CONFIRM&id=$S1" -O $S2;
rm -f /tmp/cookies.txt

同じスクリプトを関数型でも実行できる。

その場合、以下の実行方法を参考に。

wget https://gist.githubusercontent.com/kumeS/6f67b4b9085b3d2580c51b8ae4953beb/raw/4587c1306e00a576037379ee410d6c35f3daada6/gdrive_download.sh

source gdrive_download.sh

## gdrive_download ID ファイル名
gdrive_download 1VxiGEuLyzC3biFZKq68CStRGXYzBY7eg ./test02.txt

まとめ

Google Driveをwgetでファイル・ダウンロードできるリポジトリとして使う方法を紹介した。

近々、画像データ(教師データとか)のリポジトリとして使ってみようかと。

本記事を作成するにあたり、GistでのDownload Google Drive files with WGETの議論とGuyさんのスクリプトに感謝したい。

補足: gdrive_downloadのスクリプト

Guy Smoilovskyさんのgdrive_downloadスクリプト

#!/bin/sh
# Usage: gdrive_download 123-abc ./output.zip
function gdrive_download () { 
  CONFIRM=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://drive.google.com/uc?export=download&id=$1" -O- | sed -En 's/.*confirm=([0-9A-Za-z_]+).*/\1/p')
  wget --load-cookies /tmp/cookies.txt "https://drive.google.com/uc?export=download&confirm=$CONFIRM&id=$1" -O $2
  rm -f /tmp/cookies.txt
}

参考文献

gist.github.com

gist.github.com

qiita.com

qiita.com

*1:おそらく、今のところの制限では、100MB以上のファイル