Руководство
Как пользоваться 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/
-aкопирует папку со всем содержимым и сохраняет время изменения каждого файла.-vперечисляет каждый файл, а--progressпоказывает, насколько продвинулось копирование каждого.- Косая черта в конце
Camera/важна. С ней фото попадают прямо в~/Pictures/Phone. Без неё rsync создаст~/Pictures/Phone/Cameraи сложит их туда.
Запустите ту же команду через неделю, и 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 всё это имеет смысл. В общей памяти телефона кое-что из этого смысла не имеет:
-p,-oи-gкопируют права доступа, владельца и группу. Общая память Android не хранит их для отдельных файлов, так что задавать им нечего. Смонтированный телефон принимает запрос и игнорирует его, поэтому копирование проходит, но при следующем запуске rsync находит ту же разницу и просит снова.-lкопирует символические ссылки как ссылки, а на смонтированном телефоне ссылку создать нельзя, так что каждая такая попытка завершается ошибкой. Если в вашей папке есть ссылки,-Lскопирует вместо них файлы, на которые они указывают.-Dкопирует файлы устройств, которых в папке с фото или музыкой не бывает.
Из остального важны -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 |
Всем им нужна отладка по USB на телефоне; включить её можно за минуту. Инструментам adb ещё нужны Android platform tools от Google на Mac.
adb pull -a /sdcard/DCIM/Camera ~/Pictures/копирует всю папку в~/Pictures/Camera, сохраняя время и режим доступа каждого файла. Копирует он всё и каждый раз.adb push --syncкопирует файлы на телефон и пропускает те, у которых время изменения уже совпадает. Он никогда ничего не удаляет.- better-adb-sync ближе всего к rsync через adb:
pip install BetterADBSync, затемadbsync pullилиadbsync push, с--dry-run,--excludeи--del. Он начинался как переработка собственного adb-sync от Google, который в марте 2025 года отправили в архив и который теперь ссылается на него.
Подключение 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 считал время с разницей в секунду одинаковым.