Android の SD カード内フォルダと PC のフォルダを同期する

苦節 1年。ようやく同期ができた


Posted on 2018年 8月 10日 (金)
Tags android, adb, rsync
android, adb, rsync

Android の SD カードと PC のフォルダを同期させたい

写真や音楽、書類など、PC 内のフォルダと Android の SD のフォルダを同期させたいと思っていました。

しかし、標準で使える Android File Transfer は PC -> Android へのコピーであり、1つずつファイルの配置が変わったりすると、

  1. 一度 SD 内のフォルダを削除
  2. PC から SD へフォルダをコピー

ということをしなければなりませんでした。新しい写真を既存のフォルダへ入れるたびに、この作業をするのは苦痛です。

というわけで、1年前くらいから折をみて色々な方法を探していました。結論としては、google/adb-sync を利用します。

(Linux, Mac ユーザ向け)

同期させる色々な方法

SimpleSSHD を使って、ssh で PC -> android へコピー

rsync コマンドでは ssh を使って、ファイルを同期できます。

SimpleSSHD - Google Play のアプリ を Android へインストールし、PC から rsync コマンド経由でファイルを同期させます。

この方法でうまく行ったかに思えたのですが、コピー先のディレクトリによっては Permission Denied が発生し、フォルダを消せない という問題が発生しました(SimpleSSHD では root ユーザを利用しないため)。

これでは、新しい写真をコピーできても、配置換えしたときに消すことができません。

また、ssh サーバを Android のアプリケーションとして立てているためか、コピーが遅いのも難点でした(許容できる範囲ですが)。

RsyncWrapper を試す

次に、Rsync Wrapper - Google Play のアプリ といういかにもなアプリを試してみました。

こちらは remote と local を指定して、rsync を定期的に実行してくれるアプリです。

正しく設定できれば問題はなかったのかもしれませんが、僕の場合は rsync daemon を動作させているサーバに remote を設定し、Android の SD カードのフォルダを local に設定しました。しかし、

1
server sent "SSH-2.0-OpenSSH_7.4" rather than greeting

というエラーが発生し、うまく同期ができませんでした。

adb-sync を使う

最後に、google/adb-sync というのを見つけ、試してみました。

こちらは Android 開発者ツールである adb を利用したファイル同期の方法です。

そのためセットアップはやや面倒くさいのですが、PC と Android で開発者オプションを有効にします。

1. PC では Android Studio をインストール

Android Studio のインストール  |  Android Developers

そして、インストールが完了すると、adb が /Users/you/Library/Android/sdk/platform-tools というようなパスにインストールされるため、パスを通して、adb shell コマンドが実行できるようにしてください(重要)

2. Android では、開発者向けオプションを有効化

なんでこんなにわかりにくくしているのか不明ですが、Androidスマホ/タブレットで「開発者向けオプション」をオンにする:Tech TIPS - @IT のように、ビルド番号を 7 回タップして開発者向けオプションを有効にし、adb を有効化します。

3. adb shell がつながったら、google/adb-sync を git clone

あとは、adb-sync を clone し、コマンドを実行するだけです。

僕の Android は SD カードを /storage/9C33-6BBD/ にマウントしているので、このフォルダと同期させます。

--delete オプションでローカルと完全に一致するようファイルを同期します。

1
adb-sync --delete ~/Photos /storage/9C33-6BBD/photos

内部的に adb ‐ 通信用語の基礎知識 のプロトコルを使っていて、結構コピーは速いです。

Mac の場合は、実行時に。

1
unknown locale: UTF-8

というエラーが発生するかもしれません。その場合は、Does not work on MAC · Issue #7 · google/adb-sync で解決できます。

あと、adb-sync は exclude オプションがないため、.DS_Store が同期されてしまいます。

あらかじめ、Macの.DS_Storeを一括削除する - Qiita をしておくと同期がはかどります。

ということで、この結論に至るまで、合間に調べ続けてだいたい 1年くらいかかりました。

あれ、適当な有料アプリを買ったらよかったんじゃあ(白目)。

Share