ガイド
AndroidスマホとMacでrsyncを使う
rsyncには、両端にフォルダが必要です。スマホをボリュームとしてマウントすればそれがフォルダになり、rsyncはほかのドライブと同じように動きます。Androidのストレージに合わせて変えるのは、2か所だけです。
Android File TransferやOpenMTPのように、アプリ専用のウインドウの中にスマホを表示する方法では、rsyncはスマホに届きません。rsyncには両側にパスが必要だからです。代わりにスマホをボリュームとしてマウントすれば、カメラロールをMacにコピーするのはコマンド1つです。
rsync -av --progress "$PHONE/DCIM/Camera/" ~/Pictures/Phone/
スマホからMacへは、このままで動きます。スマホへ向けては、-aの代わりに-rtを使います。スマホのストレージはMacのアクセス権を保持できず、シンボリックリンクも作れないからです。新しいことはまず-nで試し、--deleteは慎重に扱います。マウントしなくても、adb自身のpullとpush、そしてbetter-adb-syncというツールで、同じ仕事の一部はできます。
スマホのパスを見つける
SideMountは、USBケーブル越しにスマホをボリュームとしてマウントし、Finderはそれをドライブと同じように表示します(セットアップは数分で済みます)。場所は/Volumesではありません。~/Library/Application Support/SideMount/Volumes/の中にある、スマホの名前のフォルダです。スマホの内部ストレージがボリュームの最上階層で、SDカードはその中のSD Cardという名前のフォルダです。
このパスを入力する必要はありません。ターミナルで、スペースを入れずにPHONE=と入力し、Finderからスマホのボリュームをウインドウにドラッグして、Returnキーを押します。パスはターミナルが書き込んでくれて、スペースの前にはバックスラッシュが付きます。以降、そのウインドウでは、どのコマンドでも"$PHONE"がスマホを指します。ダブルクォートは外さないでください。パスにスペースが含まれているからです。
スマホから写真をコピーする
rsync -av --progress "$PHONE/DCIM/Camera/" ~/Pictures/Phone/
-aは、フォルダとその中身をすべてコピーし、各ファイルの変更日時を保ちます。-vはファイルを1つずつ表示し、--progressはそれぞれの進み具合を表示します。Camera/の最後のスラッシュには意味があります。付けると、写真は~/Pictures/Phoneに直接入ります。付けないと、rsyncは~/Pictures/Phone/Cameraを作ってそこに入れます。
翌週に同じコマンドを実行すると、rsyncは新しい写真だけをコピーします。両側でファイルのサイズと変更日時を比べ、一致するものは飛ばすからです。スクリーンショットはたいていPictures/ScreenshotsかDCIM/Screenshotsにあり、パスを変えれば同じコマンドで扱えます。
小さなファイルが何千もあるフォルダは、サイズから想像するより時間がかかります。どのツールでコピーしても、ケーブル上ではファイル1つごとに決まった手間がかかるので、数百枚の写真ならすぐ終わりますが、メッセージアプリのメディアフォルダはそうはいきません。
まず-nで試す
rsync -avn "$PHONE/DCIM/Camera/" ~/Pictures/Phone/
-n(--dry-run)は、rsyncがコピーするものをすべて一覧にし、何もコピーしません。パスを変えたときやフラグを加えたとき、そして--deleteの前には毎回使ってください。
--deleteでミラーリングする
--deleteは、コピー先をコピー元とまったく同じにします。コピー先にあってコピー元にないファイルは削除されます。Macで管理している音楽フォルダにスマホを合わせたいときに向いていて、MacからAndroidに音楽をコピーするで紹介している使い方です。まずドライラン、それから本番です。
rsync -rtn --delete --exclude '.DS_Store' ~/Music/Phone/ "$PHONE/Music/"
rsync -rt --delete --progress --exclude '.DS_Store' ~/Music/Phone/ "$PHONE/Music/"
2行目を実行する前に、ドライランの結果を読んでください。パスの間違いや、コピー元の後ろのスラッシュの付け忘れがあると、--deleteが意図しないフォルダに向かうことがあり、削除は取り消せません。どちら側でもゴミ箱には入りません。また、スマホから取ったバックアップには決して使わないでください。スマホで削除した写真が次の実行でバックアップからも消えてしまい、バックアップの意味がなくなります。
--exclude '.DS_Store'を付けているのは、FinderがMacのフォルダにこのファイルを残すからです。スマホには必要ありません。
サムネイルを除外する
rsync -av --progress --exclude '.thumbnails' "$PHONE/DCIM/" ~/Pictures/Phone-DCIM/
古いスマホのギャラリーアプリは、DCIM/.thumbnailsにサムネイルをキャッシュしています。これは大きくなることがあり、必要になればスマホが作り直します。スラッシュを含まないパターンはどの階層にも一致するので、--exclude '.thumbnails'はどこにあってもこのフォルダを飛ばします。--exclude '.*'はさらに進んで、隠しファイルと隠しフォルダをすべて飛ばします。
スマホへ向けて-aを使わないほうがいい理由
-aは-rlptgoDの省略形です。Macのディスクなら、どれも意味があります。スマホの共有ストレージでは、いくつかは意味がありません。
-p、-o、-gは、アクセス権、所有者、グループをコピーします。Androidの共有ストレージはこれらをファイルごとに保持しないので、設定する先がありません。マウントしたスマホはリクエストを受け付けて無視するので、コピー自体は成功しますが、rsyncは次の実行で同じ違いを見つけ、また設定しようとします。-lはシンボリックリンクをリンクのままコピーしますが、マウントしたスマホにはリンクを作れないので、1つずつ失敗します。フォルダにリンクがあるなら、-Lを使えばリンク先のファイルをコピーします。-Dはデバイスファイルをコピーします。写真や音楽のフォルダにデバイスファイルはありません。
残りで大事なのは-rと-tです。そこで、スマホへは-rtを使うか、-aに--no-perms --no-owner --no-groupを加えます。どちらにしても-tは残してください。スマホは変更日時を保持するので、日時を保たないとすべてのファイルが変更されたように見え、毎回すべてをコピーし直すことになります。
日時の癖がもう1つ、SDカードに残っています。FAT32でフォーマットしたカードは日時を2秒単位でしか保存しないので、ファイルが1秒ずれて見え、毎回コピーし直されることがあります。--modify-window=1を加えると、rsyncは1秒違いの日時を同じとみなします。
-c(--checksum)も外しておきましょう。比べるために両側ですべてのファイルを最後まで読むので、スマホの場合はすべてのファイルをケーブル越しに引き出すことになります。サイズと日時で十分です。
Macに入っているrsync
最近のMacでrsync --versionを実行すると、こう答えます。
openrsync: protocol version 29
rsync version 2.6.9 compatible
macOS 15.4から、Appleは長年入れていたGPLのrsync 2.6.9の代わりに、BSD系のライセンスで書き直されたopenrsyncを搭載しています。rsyncのオプションの一部に対応していて、このページのコマンドはすべて動きます。実行全体の進み具合を1行で表示する--info=progress2など、rsync 3の追加機能が欲しいなら、Homebrewでインストールします(brew install rsync)。そのあとは、たいていHomebrewのものがターミナルで優先されます。
マウントせずに:adb自身のツール
| ツール | 変更分だけコピー | ドライラン | 削除を含むミラーリング | 除外パターン |
|---|---|---|---|---|
| SideMountでマウントしたスマホとrsync | 可能(サイズと日時で) | 可能(-n) | 可能(--delete) | 可能(--exclude) |
adb pull -a | 不可(すべてコピー) | 不可 | 不可 | 不可 |
adb push --sync | スマホへの方向のみ(タイムスタンプで) | 独自の-nでもデータは送られる | 不可 | 不可 |
| better-adb-sync | 可能 | 可能(-n) | 可能(--del) | 可能(--exclude) |
どれもスマホのUSB デバッグが必要です。オンにするのは1分で済みます。adbのツールには、MacにGoogleのPlatform-Toolsも必要です。
adb pull -a /sdcard/DCIM/Camera ~/Pictures/は、フォルダ全体を~/Pictures/Cameraにコピーし、各ファイルの日時とモードを保ちます。毎回すべてをコピーします。adb push --syncはスマホにファイルをコピーし、タイムスタンプがすでに一致するものは飛ばします。削除は一切しません。- better-adb-syncは、adbで使えるものの中でいちばんrsyncに近いツールです。
pip install BetterADBSyncでインストールし、adbsync pullかadbsync pushに、--dry-run、--exclude、--delを付けて使います。もとはGoogle自身のadb-syncを書き直したもので、adb-syncは2025年3月にアーカイブされ、今はbetter-adb-syncを案内しています。
スマホのadb接続を使えるのは、一度に1つのプログラムだけです。SideMountがスマホを使っているなら、先に取り出してください。取り出すと、SideMountはスマホを手放します。取り出す前からadbサーバーが動いていた場合は、adb kill-serverを一度実行して、スマホを探し直させてください。
よくある質問
rsyncで、マウントせずにAndroidスマホからファイルをコピーできますか?
いいえ。rsyncには両側にパスが必要で、OpenMTPのようなMTPアプリは、スマホを専用のウインドウの中にしか表示しません。スマホをボリュームとしてマウントしてパスを持たせるか、adb pullやbetter-adb-syncのような、スマホと直接やり取りするadbベースのツールを使ってください。
Androidスマホへのコピーでrsync -aがうまく動かないのはなぜですか?
-aはアクセス権、所有者、グループ、シンボリックリンクのコピーを求めますが、スマホの共有ストレージはそのどれも保持しません。スマホへは-rtか、-a --no-perms --no-owner --no-groupを使ってください。どのファイルが変わったかをrsyncが判断できるよう、-tは残します。
macOSに付属しているrsyncはどれですか?
macOS 15.4からはopenrsyncで、「openrsync: protocol version 29」と「rsync version 2.6.9 compatible」と表示されます。-rt、-n、--progress、--delete、--excludeに対応しています。完全なrsync 3が必要なら、brew install rsyncでインストールしてください。
スマホでrsync --deleteを使っても安全ですか?
ドライランのあとでなら安全です。まず同じコマンドを-n付きで実行して、一覧を読んでください。削除されたファイルは元に戻らないからです。Macのフォルダにスマホを合わせるために使い、スマホから取ったバックアップには決して使わないでください。スマホから消した写真が、バックアップからも消えてしまいます。
rsyncが毎回すべてのファイルをコピーし直すのはなぜですか?
たいていは-tがないためです。コピーには作成した時点の日時が付くので、オリジナルと一致しません。FAT32のSDカードでは日時が2秒単位でしか保存されないので、--modify-window=1を加えて、1秒違いの日時を同じとみなすようにします。