GoogleDriveから大容量のファイルをDLするsh
2023-06-09
概要
- GoogleDrive からファイルをDLしたかった
- 大容量ファイルは Cookie 諸々の
curl
で取る必要があるとの事
Qiita - curlやwgetで公開済みGoogle Driveデータをダウンロードする
こちらを自分用?に改造しています
その他補足
-
使い方
. ./google_drive_dl.sh --id=1hogehoge2any3dl4id --dir=$HOME
-
--id=
はDLに必要なID
ドライブ内のファイルを共有状態にし、リンクURLを知っている全員 がアクセス可能な状態にしておく
この時発行されたURL内にIDが記載されている
https://drive.google.com/file/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/view?usp=drive_link
※ Xの羅列部分 -
--dir=
は保存先
省略時の場所は./
とした -
注意
逆にwget
とかで落とせるタイプの低容量のファイルはこれだとDL出来ないと思う。
.sh 本体
#!/bin/bash
set -u
FILE_ID=
DL_DIR=
while [ $# -gt 0 ]; do
case $1 in
--id=*) FILE_ID=${1#*=} ;;
--dir=*) DL_DIR=${1#*=} ;;
esac
shift
done
if [ -z "$FILE_ID" ]; then echo "--id= を指定してください"; exit 0; fi
if [ -z "$DL_DIR" ]; then DL_DIR="./"; fi
if [ ! -d $DL_DIR ]; then echo "DL保存先" $DL_DIR "が存在しません"; exit 0; fi
curl -sc ./cookie.tmp "https://drive.google.com/uc?export=download&id=${FILE_ID}" \
| grep -o '<a href=.*">.*<\/a>' | grep -o '>.*<' | grep -o '[^><]*' \
| (
read file_name;
echo $file_name;
if [ -z "$file_name" ]; then
echo "ファイル名の取得に失敗";
exit 0;
fi
CODE="$(awk '/_warning_/ {print $NF}' ./cookie.tmp)";
echo "GoogleDrive から $FILE_ID ( $file_name ) をダウンロードします";
echo ${DL_DIR}./$file_name;
curl -Lb ./cookie.tmp "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ${DL_DIR}/$file_name;
rm -f ./cookie.tmp
)
本当は awk
の第三引数で グループマッチを使いたかったのだけれど、どうも環境によっては使えないっぽい。
awk '{match($0 , /<a href=.*">(.*)<\/a>/, a);print a[1]}'
他選択肢の gawk
が自環境で使えず、root 貰えない状況下とかもあったんで、
grep
のパイプを何度も渡す事で無理矢理ファイル名抽出してます。
URL丸々投げたのを受け取って、それをバラす .sh
の方が良かった気も…ちょっとしています (;`ω´)
興が乗ったらそっちも追加更新します (しなさそう)