はじめに
最近、データを置いておくのに良さそうな公共リポジトリが見つからず、 やっぱ、Google Driveを使うのが無難かなと思いだしたので、その関連記事を書いてみた。
今回、Google Driveをデータリポジトリとして、データを公開して、 コマンドラインでそのデータをダウンロードするやり方を扱うことにする。
また、後半部分で、wget
コマンドを使用するので、以前の記事を参考にセットアップのこと。
テストファイルの生成
はじめに、test01.txt
とtest02.txt
という、2つのテストファイルを用意してみた。
test01.txt
は、手動で作った、15B(バイト)のテキストファイルである。
test02.txt
は、seq 20000000 > test02.txt
のコマンドで作成した、232MBのテキストファイルである。
このファイル生成の詳細は、過去の記事を参考のこと。
Google Driveに任意のフォルダ(例えば、TESTフォルダ)を作成しておいて、これらのファイルをアップロードする。
Google Driveの共通フォルダ設定・ファイルアップロード
次に、Google Driveにあるフォルダの共通設定を行う。
今回、TESTというフォルダを作成したので、そこで、フォルダタブの共有
をクリックする。
次に、「リンクの取得」の変更に進んで、
フォルダの共通設定を「リンクを知っている全員」を選択して、閲覧制限をなくす。
こうやってフォルダ設定することで、フォルダ内のファイルも閲覧制限なく共通される。
ファイルURLの取得・書き換え
次に、test01.txt
とtest02.txt
の「リンクを取得」で各URLを取得する。
リンクのコピー
をしてみると、以下の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は1jlDWA1kTEks0B20U4yLQMvF2QPiS74WJ
、
test02.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でのファイル・ダウンロード
小さいファイルの場合
小さいファイルの場合は、シンプルなコマンドでダウンロードが実行できる。
今回の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
がローカルディレクトリにダウンロードできているはず。
大きいファイル(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 }
参考文献
*1:おそらく、今のところの制限では、100MB以上のファイル