Руководство

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

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

Терминал, в котором rsync копирует файлы на том телефона, и телефон в боковом меню Finder.

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.

Подключение для отладки по USB может держать только одна программа за раз. Если телефон занят 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