プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

GoogleDriveから大容量のファイルをDLするsh

概要

その他補足

  • 使い方

    . ./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 の方が良かった気も…ちょっとしています (;`ω´)
興が乗ったらそっちも追加更新します (しなさそう)