Руководство

Как пользоваться rsync с телефоном Android и Mac

rsync нужна папка на каждой стороне. Когда телефон смонтирован как том, он и есть такая папка, и rsync работает с ним, как с любым диском, с двумя небольшими поправками на память Android.

rsync не может добраться до телефона, который живёт в окне приложения, как его показывают Android File Transfer и OpenMTP, потому что ему нужен путь с каждой стороны. Смонтируйте телефон как том, и тогда скопировать фото камеры на Mac можно одной командой:

rsync -av --progress "$PHONE/DCIM/Camera/" ~/Pictures/Phone/

С телефона на Mac это работает как есть. В сторону телефона используйте -rt вместо -a, потому что память телефона не может хранить права доступа Mac, а символические ссылки на ней создать нельзя. Всё новое сначала пробуйте с -n, а с --delete обращайтесь осторожно. Без монтирования часть той же работы делают собственные pull и push из adb и инструмент 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/

Запустите ту же команду через неделю, и rsync скопирует только новые фото: он сравнивает размер и время изменения каждого файла с обеих сторон и пропускает совпадающие. Снимки экрана обычно лежат в Pictures/Screenshots или DCIM/Screenshots, и для них подходит та же команда с этим путём.

Папка с тысячами мелких файлов копируется дольше, чем можно ожидать по её размеру. Каждый файл обходится в фиксированные затраты на кабеле, каким бы инструментом его ни копировали, так что несколько сотен фото проходят быстро, а папка с медиафайлами мессенджера нет.

Сначала пробный запуск с -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/"

Прочитайте вывод пробного запуска, прежде чем выполнять вторую строку. Неверный путь или пропущенная косая черта после источника могут направить --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 всё это имеет смысл. В общей памяти телефона кое-что из этого смысла не имеет:

Из остального важны -r и -t. Поэтому в сторону телефона используйте -rt или оставьте -a и добавьте --no-perms --no-owner --no-group. Что бы вы ни выбрали, оставьте -t. Телефон хранит время изменения, а без него каждый файл выглядит изменённым, и каждый запуск копирует всё заново.

Остаётся одна особенность со временем, на SD-картах. Карта в FAT32 хранит время с точностью только до двух секунд, так что файл может разойтись с оригиналом на секунду и копироваться заново при каждом запуске. Добавьте --modify-window=1, и rsync будет считать время с разницей в секунду одинаковым.

Не используйте и -c (--checksum). Для сравнения он целиком читает каждый файл с обеих сторон, а на телефоне это значит тянуть каждый файл по кабелю. Размера и времени достаточно.

Какой rsync есть на вашем Mac

Выполните rsync --version на современном Mac, и он ответит:

openrsync: protocol version 29
rsync version 2.6.9 compatible

Начиная с macOS 15.4 Apple поставляет openrsync, переписанный заново rsync под лицензией в стиле BSD, вместо rsync 2.6.9 под GPL, который она годами держала в системе. Он принимает часть параметров rsync, и все команды на этой странице с ним работают. Ради дополнительных возможностей rsync 3, например --info=progress2 для одной строки прогресса на весь запуск, установите его через Homebrew (brew install rsync); после этого в Терминале обычно первой находится копия из Homebrew.

Без монтирования: собственные инструменты adb

ИнструментКопирует только изменённоеПробный запускЗеркало с удалениемШаблоны исключения
rsync, телефон смонтирован через SideMountДа, по размеру и времениДа, -nДа, --deleteДа, --exclude
adb pull -aНет, копирует всёНетНетНет
adb push --syncВ сторону телефона, по времени измененияЕго -n всё равно передаёт данныеНетНет
better-adb-syncДаДа, -nДа, --delДа, --exclude
rsync на смонтированном телефоне и инструменты adb, которые копируют без монтирования.

Всем им нужна отладка по USB на телефоне; включить её можно за минуту. Инструментам adb ещё нужны Android platform tools от Google на Mac.

Подключение adb к телефону может держать только одна программа за раз. Если телефон занят SideMount, сначала извлеките его, и SideMount отпустит телефон. Если ваш сервер adb был запущен ещё до извлечения, один раз выполните adb kill-server, чтобы он снова поискал телефон.

Вопросы

Может ли rsync копировать файлы с телефона Android без монтирования?

Нет. rsync нужен путь с каждой стороны, а приложение для MTP, например OpenMTP, показывает телефон только в своём окне. Смонтируйте телефон как том, чтобы у него появился путь, или воспользуйтесь инструментом на основе adb, например adb pull или better-adb-sync, которые общаются с телефоном напрямую.

Почему rsync -a ведёт себя странно при копировании на телефон Android?

-a просит копировать права доступа, владельцев, группы и символические ссылки, а общая память телефона ничего из этого не хранит. В сторону телефона используйте -rt или -a --no-perms --no-owner --no-group. Оставьте -t, чтобы rsync мог понять, какие файлы изменились.

Какой rsync идёт в комплекте с macOS?

Начиная с 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, и копии получают время своего создания, которое никогда не совпадает с оригиналами. На SD-карте с FAT32 время хранится с точностью только до двух секунд; добавьте --modify-window=1, чтобы rsync считал время с разницей в секунду одинаковым.

Ваш телефон Android в Finder.

Семь дней бесплатно, без карты. macOS 26 или новее.

Скачать для macOS