Linux rsync: Como Sincronizar Arquivos Localmente e via SSH

rsync é uma ferramenta que copia arquivos e diretórios para sistemas locais ou remotos e transfere alterações. O comportamento padrão é copiar de um lado só, da fonte para o destino, e arquivos que existem apenas no destino não são deletados a menos que --delete seja especificado.

Antes de Começar

Os exemplos são executados no shell do Linux. Primeiro, verifique se está instalado com rsync --version. No Ubuntu, se não estiver instalado, você pode instalá-lo com o seguinte comando. Para transferências remotas, o rsync é necessário em ambos os sistemas e, se estiver usando SSH (Secure Shell), o acesso remoto e as permissões de escrita no caminho de destino também são necessários.

sudo apt update
sudo apt install rsync

Se você inserir os caminhos de origem e destino de forma invertida, pode sobrescrever ou excluir os dados que deseja. Antes de lidar com dados importantes, certifique-se de garantir um backup separado e, especialmente ao usar a opção de exclusão, verifique primeiro as alterações esperadas com --dry-run. A sincronização é diferente de um backup que restaura um ponto anterior, porque erros ou corrupção na origem também podem ser refletidos no destino.

Cópia de diretório local e a diferença da barra

A seguir está um exemplo de criação de uma nova pasta de prática no diretório home e a preparação de um arquivo. Se houver uma pasta existente com o mesmo nome, use um nome diferente.

mkdir -p "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest"
printf 'hello\n' > "$HOME/rsync-demo/source/hello.txt"
rsync -av "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"
ls -l "$HOME/rsync-demo/dest/"

Se hello.txt aparecer no resultado do último comando, o conteúdo do diretório de origem foi copiado para o destino. Executar o mesmo comando rsync novamente geralmente não retransfere arquivos comuns que não foram alterados. A comparação básica utiliza tamanho de arquivo e hora de modificação, então não é uma verificação completa de que os conteúdos são iguais.

O / no final do caminho de origem significa que os conteúdos dentro do diretório, e não o próprio diretório, são copiados para o destino. Se o diretório de destino já existir e você omitir a barra, o nome do diretório de origem será criado dentro do destino.

rsync -av "$HOME/rsync-demo/source" "$HOME/rsync-demo/dest/"

Executar este comando criará dest/source/hello.txt. O dest/hello.txt criado anteriormente permanecerá como está. A diferença entre os dois caminhos é especialmente importante ao usar a opção de exclusão. Se houver espaços no caminho, coloque-o entre aspas, como no exemplo.

Opções e Verificações Frequentes

  • -a: Este é o modo de arquivamento. Ele solicita cópia recursiva e preservação de tempo, permissões, proprietário, grupo e links simbólicos. A preservação da propriedade pode ser limitada dependendo das permissões e do suporte do sistema de arquivos de destino. ACLs e atributos estendidos não estão incluídos em -a.
  • -v: Mostra a saída detalhada da operação.
  • -n ou --dry-run: Mostra as operações esperadas sem realmente fazer alterações.
  • -z: Usa compressão durante a transferência. A eficácia varia dependendo das condições da rede e dos tipos de arquivo, e nem sempre é necessária para cópias locais.

Por exemplo, você pode verificar da seguinte forma antes da cópia real. A saída mostra as alterações esperadas, e se os arquivos mudarem ou ocorrerem erros entre um teste e a execução real, o resultado real pode ser diferente.

rsync -avn "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Se você precisar verificar se arquivos com o mesmo tamanho e hora de modificação realmente têm conteúdo diferente, você pode considerar a comparação --checksum, mas pode ser custosa, já que ambos os arquivos são lidos. Para o significado detalhado das opções, consulte manual oficial do rsync.

Exclusão de arquivos que existem apenas no destino

--delete exclui itens do diretório de destino da sincronização que não existem na origem. Se você acidentalmente especificar o destino ou o nível de diretório incorreto, arquivos necessários também podem ser excluídos, portanto, primeiro verifique o caminho de destino e a barra final da origem e revise os resultados de uma execução de teste.

O exemplo a seguir pode listar itens que existem apenas no destino, como o dest/source/ criado acima, para exclusão. Execute-o apenas quando não houver arquivos a serem mantidos na pasta de prática.

rsync -avn --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Verifique as entradas deleting na saída e somente remova -n para executá-lo de fato se o intervalo de exclusão estiver correto e os backups para recuperação estiverem prontos.

rsync -av --delete "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Este comando altera apenas o destino e não exclui arquivos da origem. Arquivos que existiam apenas no destino podem não ser recuperáveis sem os procedimentos usuais de recuperação de arquivos. Prepare backups de versões separadas e verificação de restauração para dados operacionais.

Excluindo Arquivos ou Diretórios

Para excluir o diretório cache da origem do alvo de transferência, especifique-o da seguinte forma. Como o conteúdo da origem é a raiz da transferência, a barra inicial refere-se a cache nessa raiz. Primeiro, execute um teste para garantir que apenas os itens desejados sejam excluídos.

rsync -avn --exclude='/cache/' "$HOME/rsync-demo/source/" "$HOME/rsync-demo/dest/"

Se o resultado estiver correto, remova -n e copie-o. A regra de exclusão padrão geralmente protege os itens de exclusão do destino em --delete, mas usar --delete-excluded ou alterar as regras de filtro pode mudar o comportamento. Verifique padrões complexos em uma pasta separada antes de aplicá-los aos dados reais.

Sincronize com um servidor remoto via SSH

Em um ambiente pronto para acesso SSH, o seguinte comando envia o conteúdo do local de origem para o diretório de destino no servidor remoto. Substitua user, server.example.com e os caminhos por valores reais, e prepare o diretório de destino remoto com antecedência. Ao conectar pela primeira vez, verifique a impressão digital da chave do host do servidor através de um canal confiável.

rsync -avn -e ssh "$HOME/rsync-demo/source/" user@server.example.com:/home/user/backup/

Após revisar a lista de transferência esperada, remova -n para transferir. Por outro lado, para recuperar do servidor remoto para a máquina local, defina o caminho remoto como o local de origem.

rsync -avn -e ssh user@server.example.com:/home/user/backup/ "$HOME/rsync-demo/dest/"

Se a porta SSH for diferente da padrão, por exemplo, use -e 'ssh -p 2222'. Para acesso remoto, é recomendável usar uma conta com permissões limitadas e autenticação por chave SSH. Não insira a senha diretamente no comando, pois ela pode ser exposta nas informações do processo ou no histórico do shell; portanto, o exemplo sshpass -p no artigo anterior não é usado. Em tarefas automatizadas, gerencie a proteção da chave e o escopo de acesso em conjunto.