• 作成:

シェルスクリプトでGoogle Driveから巨大なファイルをダウンロードする

問題

Google Driveからcurlとかwgetで大きなファイルをダウンロードしようとすると,

Google Drive can't scan this file for viruses.

って怒られます.

Google Driveがマルウェア解析出来ないからダメらしい.

そのせいでtar.gzファイルをダウンロードしたはずなのにHTMLをダウンロードしてしまい, 後々の解凍がダメになります.

人力でダウンロードした場合は「それでもダウンロードする」みたいなボタンがあるのでそれをクリックすれば良いのですが, shell scriptなどによる自動的なダウンロードの場合どうすれば良いのか調べましょう.

wget/curl large file from google drive - Stack Overflow を見ます.

初手の手法は廃止されるからダメらしい. 他にcirculosmeos/gdown.pl: Google Drive direct download of big files という専用のツールがあるそうですが, このためだけに専用ツールは導入したくないですね…

他にはHTMLをスクレイピングするコードなどもありますね. 流石にやりたくない.

今はperlだけじゃなくてpipでさくっと入るバージョンもあるらしい. みんなpip使ってるしこれでも良いのでは? いや流石にグローバル空間やプロジェクト空間汚染して新しいツールダウンロードのためだけに入れたくないですね…

そもそもGoogle Driveに固執しなくてS3とかに上げれば良いのでは? という説一理ありますね…

How to download a Google Drive url via curl or wget - Stack Overflow の最初の回答は割とスマートに対処しているように見えます.

curlやwgetで公開済みGoogle Driveデータをダウンロードする - Qiita でもこの手法が採用されていますね.

この先Google Driveの返すHTMLが複雑化したらどうなるかわかりませんが, 今はAwkでも処理できるレベルなのでこれで良いでしょう.

回答ではcookieディレクトリをその場に作っていますが被らないようにtmpfile的な奴を使ってテンポラリファイルを作ろうかと思いましたが, このプロジェクトディレクトリで実行されるわけなので実行した後削除すれば問題ないですね.

やっぱりset -euxしませんか?

今回は運良く早めにエラー表示を見つけることが出来ましたけど, 運が悪かったらかなり手こずったと思いますね.

やっぱりシェルスクリプト書く時はset -euxは必須だと思います. 特にシェルの素人が書く場合は.(私も素人です)

こういう意見もありますが, シェルスクリプトの set -e は罠いっぱい - Togetter 個人的にはシェルスクリプトでset -eが問題になるような複雑な操作(算術操作とか)をするならもうPythonとかに逃げたいですね… シェル芸人は頑張ってください.