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

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


Posted on Fri, Aug 10, 2018
Tags android, adb, rsync

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

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

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

  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 に設定したのですが、

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 オプションでローカルと完全に一致するようにファイルを同期します。

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

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

Mac 場合は、実行時に

unknown locale: UTF-8

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

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

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

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

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