前提
使用した環境は次の通り。
- OSはCentOS Linux release 7.5(x86_64)を使用
- gdrive-linux-x64(2.1.1)を使用GitHub
Google Drive CLI Client. Contribute to prasmussen/gdrive dev…
- googleアカウントを登録済み
gdriveツールのセットアップ
ダウンロード
(トップページに表示しているmasterブランチのREADME.mdには“Download gdrive from one of the links below”とありますが、該当するダウンロードリンクがありません。リリースタグのREADME.mdにはダウンロードリンクがあるので、上記の「ダウンロード先リンク」は最新のリリースタグ2.1.0にあるREADME.mdを示しています。)
上記のgithhubのページから対応するプログラムをダウンロードします。
rpmやtar.gz等のパッケージ化されたものではなく、実行プログラム1つだけのダウンロードです。
私の環境は64ビットOSなので、gdrive-linux-x64がダウンロード対象です。
gdrive-linux-x64のリンクをコピーし、次のようにLinuxのcurlからダウンロードします。
いくつかリダイレクトされるので”-L”オプションを、ダウンロードファイルをgdriveとするために”-o”オプションを使います。
1 2 3 4 5 6 | [user@server]$ curl -L -o gdrive "https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 383 0 383 0 0 531 0 --:--:-- --:--:-- --:--:-- 531 0 0 0 7622k 0 0 4195k 0 --:--:-- 0:00:01 --:--:-- 20.0M [user@server]$ chmod a+x gdrive |
アクセストークンの取得
詳細は参考をご覧ください。
gdriveの任意のコマンドを実行します。
google認証をおこなうためのURLが表示されるので、そのURLを任意のブラウザで開きます。
1 2 3 4 5 6 | [user@server]$ ./gdrive list Authentication needed Go to the following url in your browser: https://accounts.google.com/o/oauth2/auth?access_type=...ive&state=state Enter verification code: |
ブラウザにgoogle認証画面が表示されるので認証を行います。
認証に成功すると、gdriveにアクセス許可を与えるかの画面が表示されるので「許可」をクリックします。
コードが表示されるので、これをコピーします。
上記でコピーしたコードを、先ほどの「Enter verification code:」にペーストします。
問題なければ、gdrive listの実行結果が表示されます。
1 2 3 | Enter verification code: 4/AAB...Ins Id Name Type Size Created 1LCXXXXXL-Z_EWXXXXXbuUZ81F-5XXXXXpuQXXXXX6eY test doc 2018-06-09 23:21:18 |
なお、認証情報をクリアしたい場合、既定ではホームディレクトリの.gdriveフォルダをリネームまたは削除してください。この際、google側の情報も併せて削除することをお勧めします。
(2020年6月現在、Googleアカウントのページのメニューで[セキュリティ]->[サードパーティによるアクセスを管理]->[GDrive]->「アクセス権を削除」を選択してアクセス権を削除可。)
gdriveの検証
googleドライブとgdriveコマンド
- フォルダやファイルのパスではなく、IDを使って操作対象のフォルダ・ファイルを指定する。フォルダやファイルのIDは、”gdrive list”の実行結果で確認可。フォルダの場合は、google driveのURLの最後に記載されている値で確認可。
- 検索する場合、既定ではすべてのフォルダが検索対象になる。フォルダを限定したい場合は、後述のように検索条件に”in parents”を追加する。
- ゴミ箱にある削除されたファイルも検索対象になる。対象外にしたい場合は、後述のように検索条件に”trashed = false”を追加する。
- ファイルの種類はMIMEで定義されている。例えば、フォルダの場合は”application/vnd.google-apps.folder”である。サポートされるMIMEタイプはgoogleのリファレンス(Supported MIME Types)に定義されている。
ファイル・フォルダリスト取得: gdrive list
フォルダ・ファイルの一覧を取得する場合、gdriveのlistを使用します。
指定可能な検索条件の定義はgoogleの検索パラメータリファレンスを参照のこと。
同じく、ソート条件に関してはgoogle driveのapiリファレンスを参照のこと。
検索条件とソート条件の指定
ファイル名に”test”を含む、ゴミ箱のファイルは対象外、を条件にファイルを検索する。
検索結果は、ファイル名(既定の昇順)、更新日時(降順)でソートする。
1 2 3 | [user@server]$ ./gdrive list --query "name = 'test' and trashed = false" --order "name, modifiedTime desc" Id Name Type Size Created 1234567890123456789012345678901234567890AbCd test doc 2018-06-09 23:21:18 |
フォルダのリストを取得
google drive上の全てのフォルダのリストを取得する。
1 2 3 | [user@server]$ ./gdrive list --query "trashed = false and mimeType = 'application/vnd.google-apps.folder'" Id Name Type Size Created ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg testdir dir 2018-06-09 15:00:38 |
フォルダ内のファイルのリストを取得
特定フォルダ内のファイルのリストを取得する。
1 2 3 4 5 | [user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" Id Name Type Size Created 123456789012345678901234567890123 test_20180610-045738.tar.gz.aes bin 21.4 MB 2018-06-10 04:57:44 ... 1234567890123456789012345678901234567890AbCd test doc 2018-06-09 23:21:18 |
ファイルアップロード: gdrive upload
所定のフォルダのIDを指定して、そのフォルダにdummy.datファイルをアップロードする。
1 2 3 | [user@server]$ ./gdrive upload --parent "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" ./dummy.dat Uploading ./dummy.dat Uploaded 123456789012345678901234567890123 at 13.4 MB/s, total 100.0 MB |
シェルスクリプトによる検証
バックアップファイルをgoogle driveにアップロードするシェルスクリプト。
10世代までバックアップファイルを保持する。
実行する前に”chmod a+x backup2gd.sh”をして、実行可状態にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #!/bin/sh # # backup2gd.sh - backup to google drive. # # # 定数定義 # # アップロード対象のローカルファイル file_name=backup.dat # アップロード時のファイル名 gd_file_prefix=backup_ gd_file_suffix=<code>date "+%Y%m%d_%H%M%S" gd_file_name=${gd_file_prefix}${gd_file_suffix}.dat # アップロード先フォルダID gd_dest_dir_id=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg # gdriveコマンドパス gd_cmd=./gdrive # 世代管理数 gd_keep_gen=10 # 世代管理用の定数 let "gd_list_max=gd_keep_gen + 1" gd_list_query="'$gd_dest_dir_id' in parents" gd_list_query="$gd_list_query and trashed = false" gd_list_query="$gd_list_query and name contains '$gd_file_prefix'" gd_list_query="$gd_list_query and mimeType != 'application/vnd.google-apps.folder'" gd_list_order="name desc" # # ファイルアップロード # $gd_cmd upload --parent $gd_dest_dir_id --name $gd_file_name $file_name if [ $? -ne 0 ]; then exit 1 fi # # 世代管理(ファイル一覧の取得と保持世代を超えたファイルの削除) # # 管理対象世代+1個までのファイルリストを取得、新しいものが上にくるようにソート。 # 一番最後の行のファイルが世代管理対象外のファイルとなるので、その行を取得。 gd_del_file_line=<code>$gd_cmd list --query "$gd_list_query" --order "$gd_list_order" -m $gd_list_max --name-width 0 --no-header | sed -n ${gd_list_max}p # 当該行からIDを取得する。(当該行がない場合は空) # もしIDを取得できた場合はそのファイルを削除する。 gd_del_file_id=<code>echo "$gd_del_file_line" | awk '{print $1}' if [ -n "$gd_del_file_id" ]; then echo "deleting old backup file on storage: $gd_del_file_id" $gd_cmd delete $gd_del_file_id if [ $? -ne 0 ]; then exit 1 fi fi exit 0 |
実行結果は次の通り。
11世代目ができたタイミングで、そのバックアップファイルを削除している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | [user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc" Id Name Type Size Created 123456789012345678901234567890991 test.txt bin 2018-06-10 20:32:14 123456789012345678901234567890992 dummy.dat bin 100.0 MB 2018-06-10 20:36:16 123456789012345678901234567890009 backup_20180610_213342.dat bin 1000.0 KB 2018-06-10 21:33:43 123456789012345678901234567890008 backup_20180610_213020.dat bin 1000.0 KB 2018-06-10 21:30:21 123456789012345678901234567890007 backup_20180610_212616.dat bin 1000.0 KB 2018-06-10 21:26:17 123456789012345678901234567890006 backup_20180610_212452.dat bin 1000.0 KB 2018-06-10 21:24:53 123456789012345678901234567890005 backup_20180610_212420.dat bin 1000.0 KB 2018-06-10 21:24:21 123456789012345678901234567890004 backup_20180610_212210.dat bin 1000.0 KB 2018-06-10 21:22:11 123456789012345678901234567890003 backup_20180610_212048.dat bin 1000.0 KB 2018-06-10 21:20:49 123456789012345678901234567890002 backup_20180610_212045.dat bin 1000.0 KB 2018-06-10 21:20:45 123456789012345678901234567890001 backup_20180610_212030.dat bin 1000.0 KB 2018-06-10 21:20:32 [user@server]$ ./backup2gd.sh Uploading backup.dat Uploaded 123456789012345678901234567890010 at 348.4 KB/s, total 1000.0 KB [user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc" Id Name Type Size Created 123456789012345678901234567890991 test.txt bin 2018-06-10 20:32:14 123456789012345678901234567890992 dummy.dat bin 100.0 MB 2018-06-10 20:36:16 123456789012345678901234567890010 backup_20180610_213450.dat bin 1000.0 KB 2018-06-10 21:34:53 123456789012345678901234567890009 backup_20180610_213342.dat bin 1000.0 KB 2018-06-10 21:33:43 123456789012345678901234567890008 backup_20180610_213020.dat bin 1000.0 KB 2018-06-10 21:30:21 123456789012345678901234567890007 backup_20180610_212616.dat bin 1000.0 KB 2018-06-10 21:26:17 123456789012345678901234567890006 backup_20180610_212452.dat bin 1000.0 KB 2018-06-10 21:24:53 123456789012345678901234567890005 backup_20180610_212420.dat bin 1000.0 KB 2018-06-10 21:24:21 123456789012345678901234567890004 backup_20180610_212210.dat bin 1000.0 KB 2018-06-10 21:22:11 123456789012345678901234567890003 backup_20180610_212048.dat bin 1000.0 KB 2018-06-10 21:20:49 123456789012345678901234567890002 backup_20180610_212045.dat bin 1000.0 KB 2018-06-10 21:20:45 123456789012345678901234567890001 backup_20180610_212030.dat bin 1000.0 KB 2018-06-10 21:20:32 [user@server]$ ./backup2gd.sh Uploading backup.dat Uploaded 123456789012345678901234567890011 at 975.4 KB/s, total 1000.0 KB deleting old backup file on storage: 123456789012345678901234567890001 Deleted 'backup_20180610_212030.dat' [user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc" Id Name Type Size Created 123456789012345678901234567890991 test.txt bin 2018-06-10 20:32:14 123456789012345678901234567890992 dummy.dat bin 100.0 MB 2018-06-10 20:36:16 123456789012345678901234567890011 backup_20180610_213516.dat bin 1000.0 KB 2018-06-10 21:35:17 123456789012345678901234567890010 backup_20180610_213450.dat bin 1000.0 KB 2018-06-10 21:34:53 123456789012345678901234567890009 backup_20180610_213342.dat bin 1000.0 KB 2018-06-10 21:33:43 123456789012345678901234567890008 backup_20180610_213020.dat bin 1000.0 KB 2018-06-10 21:30:21 123456789012345678901234567890007 backup_20180610_212616.dat bin 1000.0 KB 2018-06-10 21:26:17 123456789012345678901234567890006 backup_20180610_212452.dat bin 1000.0 KB 2018-06-10 21:24:53 123456789012345678901234567890005 backup_20180610_212420.dat bin 1000.0 KB 2018-06-10 21:24:21 123456789012345678901234567890004 backup_20180610_212210.dat bin 1000.0 KB 2018-06-10 21:22:11 123456789012345678901234567890003 backup_20180610_212048.dat bin 1000.0 KB 2018-06-10 21:20:49 123456789012345678901234567890002 backup_20180610_212045.dat bin 1000.0 KB 2018-06-10 21:20:45 |
参考)アクセストークン取得時のエラー
- 2021年5月現在、新規にアクセストークンの取得(gdriveから提示された認証URLをブラウザで開く)を行うと、次のようにgoogleにブロックされてしまいます。このアプリはブロックされます
このアプリが、Google アカウントのプライベートな情報にアクセスしようとしました。
アカウントを安全に保つため、Google によりこのアクセスはブロックされました。 - どうやら、gdriveは「googleが認可しないアプリ」になってしまったようです。
この問題の回避策として「Google Cloud Platformにて、開発用のGoogle Drive APIを有効化して認証情報を設定する。」「発行されたOAuth2用のクライアントIDやシークレットをgdriveのソースに埋め込んでソースをリビルドする。」が必要とのことです。 - 過去にアクセストークンを取得している場合、問題なくgdriveを使用できます。
gdriveが正常に動作する環境があるなら、ホームディレクトリの.gdriveフォルダを新環境にコピーすることで、この問題を回避できるかもしれません。(当方では未確認) - 正直、ここまでするなら別のツールをお薦めします。
(gdriveはシンプルで使いやすくお薦めだったのですが残念です…)