rsyncO comando: rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E é a metade específica do macOS, e deixá-lo de fora perde sem aviso os atributos estendidos e resource forks.
-a é o modo de arquivamento: percorre as subpastas e preserva permissões, dono, datas e links simbólicos. É a opção que todo mundo conhece.-E preserva os atributos estendidos e resource forks do macOS. Etiquetas do Finder, marcas de quarentena, ícones personalizados e boa parte dos metadados dos aplicativos ficam ali. Sem ele, tudo isso some, e nada avisa.--delete remove arquivos do destino quando eles somem da origem. É isso que torna a cópia um espelho, e é a opção sobre a qual mais vale pensar.-v para mostrar a saída, -n para um teste. Sempre faça um teste na primeira vez com um comando que tenha --delete.~/Documents copia a pasta para dentro do destino, resultando em /Volumes/Backup/Documents/Documents. ~/Documents/ copia o conteúdo dela, que quase sempre é o que você queria. Em um comando que também tem --delete, errar isso apaga tudo o mais que estava no destino.--exclude para o que não vale copiar: --exclude '.DS_Store', --exclude 'node_modules', --exclude 'Library/Caches'.O macOS vem com uma versão do rsync que dá conta disso. Se você quiser a versão mais nova do projeto original, o Homebrew tem, e ela lida melhor com ACLs no macOS.
O rsync faz o destino ficar igual à origem. Isso é uma cópia, e uma cópia não é histórico. Um documento que você apagou na terça passada some do backup na próxima vez que ele roda. Assim como a versão boa de um arquivo que você sobrescreveu depois, e tudo o que um ransomware alcançou antes de a tarefa rodar.
Tirar o --delete não resolve. Isso dá um destino que acumula todo arquivo que você já teve, ainda com exatamente uma versão de cada, e sem como saber o que é atual.
--link-destO truque padrão é criar uma nova pasta com data a cada execução e fazer hard links dos arquivos inalterados para a anterior, assim arquivos idênticos não custam nada:
DEST=/Volumes/Backup
TODAY=$(date +%F)
rsync -aE --delete \
--link-dest="$DEST/latest" \
~/Documents "$DEST/$TODAY"
ln -snf "$DEST/$TODAY" "$DEST/latest"
Agora cada pasta com data parece um backup completo, e só os arquivos alterados ocupam espaço. Esta é mais ou menos a ideia em que o Time Machine se baseia.
Duas ressalvas. Hard links fazem com que as cópias não sejam independentes: uma corrupção no bloco de baixo afeta todo snapshot que o compartilha. E é preciso um sistema de arquivos com suporte a hard links, então funciona em um drive externo e não dentro da maioria das pastas na nuvem.
O rsync não criptografa nada armazenado. Se o destino é uma pasta na nuvem ou um drive que sai de casa, criptografe antes de gravar:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
Isso é um único arquivo opaco: sem cópia incremental, sem restaurar um arquivo sem descompactar tudo, e uma só frase secreta entre você e tudo. Essa troca importa, e é o ponto em que a maioria das pessoas para de montar tudo à mão.
O cron ainda existe no macOS, mas o launchd é o caminho suportado. Um plist em ~/Library/LaunchAgents/ com um StartCalendarInterval roda seu script diariamente. O macOS vai pedir Acesso Total ao Disco para o que o executar, porque a leitura de Documentos e Mesa é protegida.
O que quer que você programe, faça o resultado ser gravado em um lugar que você vai realmente ver, e confira se o backup é recente:
find /Volumes/Backup -type f -newermt '-7 days' | head
Uma tarefa silenciosa é o modo de falha. Ela não para com um erro na sua tela, ela para de madrugada, quatro meses atrás.
Os comandos acima cobrem a cópia. O que eles não cobrem é o que você realmente quer no dia em que algo dá errado: versões que sobrevivem a uma execução do espelho, criptografia que ainda deixa restaurar um arquivo, uma leitura que confere cada parte com o hash e algo que avisa quando o drive não aparece há uma semana.
Cada uma dessas coisas é um fim de semana de scripts, e depois a manutenção é sua. O Copy Shelter é a mesma ideia com essas partes já incluídas, e é gratuito para um local.
rsync perde as etiquetas do Finder?Porque o -a sozinho não leva os atributos estendidos no macOS. Adicione -E. Se você também precisa de ACLs, use -A, e considere a versão do Homebrew, que lida com elas de forma mais confiável que a do sistema.
Sim, tanto para um compartilhamento montado em /Volumes quanto via SSH para o próprio NAS. Via SSH é mais rápido e não depende de a montagem estar presente, e muitos NAS já têm rsync integrado.
sudo?Não para a sua própria pasta pessoal. Você precisa dar Acesso Total ao Disco ao Terminal, ou ao que o launchd rodar, antes que o macOS deixe ler Documentos, Mesa e Downloads.
--delete é perigoso?Ele está fazendo exatamente o que você pediu, e essa é a parte perigosa. Faça um teste com -n na primeira vez e confira se o caminho de destino está certo: um erro de digitação com --delete apontado para a pasta errada remove arquivos de lá.
Sim, é para isso que o rsync existe. Rode de novo e ele transfere só o que falta ou mudou. Adicione --partial para que um arquivo grande transferido pela metade seja mantido e retomado.
Próximo: como conferir se a cópia pode mesmo ser lida.