Google Colaboratoryを使ってGoogle Driveのファイルを別のアカウントにごっそり移行する

7月 3, 2021

あるGoogleアカウントの容量が逼迫してきたので、新しくアカウントを作成して対象のフォルダを移行しようと思います。

Googleアカウントをいっぱい作れば、無限にクラウドストレージが増えていくと安易に考えています。

以降は、移行したいファイルを持っているGoogleアカウントを「旧Googleアカウント」、新しく作ったアカウントを「新Googleアカウント」として解説していきます。

やりたいこと

  1. 旧GoogleアカウントのGoogle Driveからファイルをダウンロードする
  2. ダウンロードしたファイルを新GoogleアカウントのGoogle Driveにアップロードする

やりたいことは単純。

手作業で少しだけやってみましたが、、、むり、、、ってなりました。

どのように実現するか

一度ローカルにダウンロード、Google Driveにアップロードを試してみましたが、めんどくさい。。

ネットワークがぶちぶち切れるし、Webの使い勝手がいまいちで操作に時間がかかってしまいます。

なので、Google Colaboratoryを使ってPythonで自動化しようと思います。

Colaboratoryとは、Googleのサービスで、ブラウザで Python を記述、実行できるサービスです。

環境構築不要で、簡単にGoogle Driveへもアクセスできます。また、GPUも無料で使えるので、機械学習をやりたい時なんかにも便利です。

Colaboratory へようこそ

  1. Colaboratoryに新Googleアカウントでログインする
  2. 旧GoogleアカウントでGoogle Driveにログインして、対象のフォルダを共有に設定する
  3. ColaboratoryでPythonのソースコードを書く
  4. 実行する

やってみる

Colabratoryにログインする

こちらからColabratoryにログインします。

https://colab.research.google.com/?hl=ja

旧GoogleアカウントでGoogle Driveにログインして、対象のフォルダを共有に設定する

こちらからGoogle Driveにログインします。

https://drive.google.com/drive/my-drive?hl=ja

ログイン後、対象のフォルダを右クリックして、「共有」をクリックします。

「リンクを取得」が表示されるので、「リンクを知っている全員」を選択してリンクをコピーします。

ここでコピーしたリンクは後で使うので控えておきましょう。

ColaboratoryでPythonのソースコードを書く

Colaboratoryの使い方はこちらを参照ください。

https://colab.research.google.com/notebooks/intro.ipynb?hl=ja#scrollTo=GJBs_flRovLc

基本的にはJupyter notebookと同じ感じです。

Google Driveをインポートします。

from google.colab import drive 
drive.mount('/content/gdrive')

Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=○○○○

Enter your authorization code:

URLをクリックしてログインして、認証コードを取得して貼り付けます。

次のソースコードを貼り付けて実行して、ダウンロードします。

import io
from googleapiclient.http import MediaIoBaseDownload
from googleapiclient.discovery import build
import google.colab
import googleapiclient.discovery
import googleapiclient.http

def listFiles(service, folder_id):
    listOfFiles = []

    query = f"'{folder_id}' in parents and mimeType='image/jpeg'"

    # Get list of jpg files in shared folder
    page_token = None
    while True:
        response = service.files().list(
            q=query,
            fields="nextPageToken, files(id, name)",
            pageToken=page_token,
            includeItemsFromAllDrives=True, 
            supportsAllDrives=True
        ).execute()

        for file in response.get('files', []):
            listOfFiles.append(file)

        page_token = response.get('nextPageToken', None)
        if page_token is None:
            break

    return listOfFiles

def downloadFiles(service, listOfFiles):
    # Download all jpegs
    for fileID in listOfFiles:
        request = service.files().get_media(fileId=fileID['id'])
        fh = io.FileIO(
            f"/content/gdrive/My Drive/{fileID['name']}",
            mode='wb'
        )
        downloader = MediaIoBaseDownload(fh, request)

        done = False
        while done is False:
            status, done = downloader.next_chunk()
            print("Downloading..." + str(fileID['name']))

if __name__ == "__main__":
  file_id = 'TAKE ID FROM SHAREABLE LINK'
  google.colab.auth.authenticate_user()
  service = googleapiclient.discovery.build('drive', 'v3')
  listOfFiles = listFiles(service, file_id)
  downloadFiles(service, listOfFiles)

49行目のTAKE ID FROM SHAREABLE LINKには事前に取得しておいたリンクを貼り付けます。

例えば、https://drive.google.com/drive/folders/1rsQFvHqabD70fe_rdTPQ-aBcDZhywreJ?usp=sharingであれば、1rsQFvHqabD70fe_rdTPQ-aBcDZhywreJを指定しましょう。

出力先は38行目で/content/gdrive/My Drive/としていますが、適宜変更すれば良いと思います。

実行結果

今回の対象ファイルは、750枚ほどで7GBほどでしたが、12分ほどで移行を完了できました。

手作業だったら何時間かかってたことか、、、。

最後に

今回初めてColaboratory使ってみましたが、すごく便利で色々活用できそうな気がしました。

Googleのサービスとの連携もすぐできそうだし、無料でGPUが使えるってことがすごい。機械学習の勉強もできちゃいます。

また、今回Googleのストレージの分散もできたので、これを元に用途ごとにアカウント分けていけば無料プランでも十分にやっていけるんじゃないかと思いました。