Guia

Como usar o rsync com um celular Android e um Mac

O rsync precisa de uma pasta em cada ponta. Com o celular montado como volume, ele vira uma, e o rsync roda como em qualquer disco, com duas pequenas mudanças por causa do armazenamento do Android.

O rsync não alcança um celular que vive dentro da janela de um app, do jeito que o Android File Transfer e o OpenMTP o mostram, porque ele precisa de um caminho de cada lado. Monte o celular como um volume, e copiar as fotos da câmera para o Mac vira um comando só:

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

Do celular para o Mac, isso funciona do jeito que está. No sentido do celular, use -rt no lugar de -a, porque o armazenamento do celular não guarda as permissões do Mac, e não é possível criar links simbólicos nele. Teste qualquer coisa nova com -n antes e trate o --delete com cuidado. Sem montar, o pull e o push do próprio adb, e uma ferramenta chamada better-adb-sync, fazem parte do mesmo trabalho.

Como achar o caminho do celular

O SideMount monta o celular pelo cabo USB como um volume que o Finder mostra como um disco (configurar leva poucos minutos). Ele não fica em /Volumes: é uma pasta com o nome do celular dentro de ~/Library/Application Support/SideMount/Volumes/. O armazenamento interno do celular é a raiz do volume, e um cartão SD é uma pasta chamada SD Card dentro dela.

Você não precisa digitar esse caminho. No Terminal, digite PHONE= sem espaços, arraste o volume do celular do Finder para a janela e pressione Return. O Terminal escreve o caminho para você, com uma barra invertida antes de cada espaço. A partir daí, "$PHONE" representa o celular em todos os comandos daquela janela. Mantenha as aspas duplas: o caminho tem um espaço.

Copiar as fotos do celular

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

Rode o mesmo comando na semana que vem e o rsync copia só as fotos novas: ele compara o tamanho e a data de modificação de cada arquivo dos dois lados e pula os que batem. As capturas de tela costumam ficar em Pictures/Screenshots ou DCIM/Screenshots, e usam o mesmo comando com esse caminho.

Uma pasta com milhares de arquivos pequenos demora mais do que o tamanho sugere. Cada arquivo tem um custo fixo no cabo, seja qual for a ferramenta que o copia, então algumas centenas de fotos passam rápido, e a pasta de mídia de um app de mensagens, não.

Teste antes com -n

rsync -avn "$PHONE/DCIM/Camera/" ~/Pictures/Phone/

-n, ou --dry-run, faz uma simulação: lista tudo o que o rsync copiaria e não copia nada. Use sempre que mudar um caminho ou acrescentar uma opção, e toda vez antes do --delete.

Espelhar com --delete

O --delete faz do destino uma cópia exata da origem: qualquer arquivo no destino que não esteja na origem é apagado. Isso serve para uma pasta de músicas que você mantém no Mac e quer que o celular acompanhe, como em copiar músicas do Mac para o Android. Primeiro a simulação, depois para valer:

rsync -rtn --delete --exclude '.DS_Store' ~/Music/Phone/ "$PHONE/Music/"
rsync -rt --delete --progress --exclude '.DS_Store' ~/Music/Phone/ "$PHONE/Music/"

Leia a simulação antes de rodar a segunda linha. Um caminho errado, ou uma barra faltando depois da origem, pode apontar o --delete para uma pasta que você não queria, e ele apaga para sempre: nada vai para a lixeira em nenhum dos lados. Também nunca o use num backup tirado do celular. Uma foto que você apagasse no celular sumiria do backup na execução seguinte, o que acaba com o propósito do backup.

O --exclude '.DS_Store' está ali porque o Finder deixa esses arquivos nas pastas do Mac, e o celular não tem nenhum uso para eles.

Deixar as miniaturas de fora

rsync -av --progress --exclude '.thumbnails' "$PHONE/DCIM/" ~/Pictures/Phone-DCIM/

Os apps de galeria de celulares mais antigos guardam miniaturas em DCIM/.thumbnails, que pode crescer bastante e que o celular refaz quando precisa. Um padrão sem barra vale em qualquer nível, então --exclude '.thumbnails' pula essa pasta onde quer que ela esteja. --exclude '.*' vai além e pula todos os arquivos e pastas ocultos.

Por que -a é um mau hábito no sentido do celular

-a é um atalho para -rlptgoD. Num disco do Mac, tudo isso faz sentido. No armazenamento compartilhado de um celular, várias dessas opções não fazem:

Do resto, o que importa é -r e -t. Então, no sentido do celular, use -rt, ou mantenha o -a e acrescente --no-perms --no-owner --no-group. Mantenha o -t em qualquer caso. O celular guarda as datas de modificação, e sem elas todo arquivo parece alterado, então cada execução copia tudo de novo.

Sobra uma peculiaridade de horário, nos cartões SD. Um cartão formatado em FAT32 guarda os horários com precisão de dois segundos, então um arquivo pode parecer um segundo diferente e ser copiado de novo a cada execução. Acrescente --modify-window=1, que diz ao rsync para tratar horários com um segundo de diferença como iguais.

Deixe de fora também o -c (--checksum). Ele lê cada arquivo inteiro dos dois lados para compará-los, o que, no celular, significa puxar todos os arquivos pelo cabo. Tamanho e data bastam.

O rsync que vem no seu Mac

Rode rsync --version num Mac recente e ele responde:

openrsync: protocol version 29
rsync version 2.6.9 compatible

Desde o macOS 15.4, a Apple traz o openrsync, uma reescrita sob uma licença no estilo BSD, no lugar do rsync 2.6.9 sob GPL que manteve por anos. Ele aceita um subconjunto das opções do rsync, e todos os comandos desta página funcionam com ele. Para os extras do rsync 3, como --info=progress2, que mostra uma única linha de progresso para a execução inteira, instale-o com o Homebrew (brew install rsync); depois disso, a cópia do Homebrew costuma vir primeiro no Terminal.

Sem montar: as ferramentas do próprio adb

FerramentaCopia só o que mudouSimulaçãoEspelha apagandoPadrões de exclusão
rsync, com o celular montado pelo SideMountSim, por tamanho e dataSim, -nSim, --deleteSim, --exclude
adb pull -aNão, copia tudoNãoNãoNão
adb push --syncNo sentido do celular, pela dataO -n dele ainda envia os dadosNãoNão
better-adb-syncSimSim, -nSim, --delSim, --exclude
O rsync num celular montado, e as ferramentas do adb que copiam sem montá-lo.

Todas elas precisam da depuração USB no celular; ativá-la leva um minuto. As ferramentas do adb também precisam das Android platform tools do Google no Mac.

Só um programa por vez pode ocupar a conexão adb de um celular. Se o SideMount está com o celular, ejete-o antes, o que libera o celular. Se o seu servidor adb já estava rodando antes de ejetar, rode adb kill-server uma vez para que ele procure o celular de novo.

Perguntas

O rsync consegue copiar arquivos de um celular Android sem montá-lo?

Não. O rsync precisa de um caminho de cada lado, e um app de MTP como o OpenMTP só mostra o celular dentro da própria janela. Monte o celular como um volume para que ele tenha um caminho, ou use uma ferramenta baseada no adb, como o adb pull ou o better-adb-sync, que conversam direto com o celular.

Por que o rsync -a se comporta mal ao copiar para um celular Android?

O -a pede para copiar permissões, donos, grupos e links simbólicos, e o armazenamento compartilhado de um celular não guarda nada disso. Use -rt no sentido do celular, ou -a --no-perms --no-owner --no-group. Mantenha o -t, para que o rsync saiba quais arquivos mudaram.

Qual rsync vem com o macOS?

Desde o macOS 15.4, é o openrsync, que informa “openrsync: protocol version 29” e “rsync version 2.6.9 compatible”. Ele aceita -rt, -n, --progress, --delete e --exclude. Para o rsync 3 completo, instale-o com brew install rsync.

É seguro usar o rsync --delete com um celular?

Só depois de uma simulação. Rode o mesmo comando com -n antes e leia a lista, porque os arquivos que ele apaga somem para sempre. Use-o para deixar o celular igual a uma pasta do Mac, nunca num backup tirado do celular, onde ele apagaria as fotos que você removeu do celular.

Por que o rsync copia todos os arquivos de novo a cada execução?

Geralmente porque falta o -t, então as cópias ficam com o horário em que foram feitas e nunca batem com os originais. Num cartão SD em FAT32, os horários são guardados com precisão de dois segundos; acrescente --modify-window=1 para que o rsync trate horários com um segundo de diferença como iguais.

Seu celular Android, no Finder.

Grátis por sete dias, sem cartão. macOS 26 ou posterior.

Baixar para macOS