Esta é mais uma dica da série sobre comandos de terminal. Desta vez o foco é o comando Rsync, a “vedete das cópias”. Eu praticamente passo boa parte do meu dia lidando com grandes volumes de arquivos e sempre que preciso transferí-los entre discos, volumes ou mesmo entre máquinas recorro a esta poderosa ferramenta.O Rsync traz inúmeros recursos para otimizar as cópias, como por exemplo compacta durante a transferência, só transfere aquilo que não foi transferido, faz transferência recursiva, preserva todos os atributos que você desejar entre outros.
1 – No exemplo mais básico, vamos copiar todos os arquivos jpg do diretório atual para um outro volume.
$ rsync -a *.jpg /mnt/stor
Este é um exemplo bem simples e que não há muito o que se detalhar. A mágica acontece toda automaticamente. O parâmetro ‘-a’ é uma especie de “mix” com os parâmetros “-rlptgoD” e você praticamente o usará em quase todas as vezes que usar o comando rsync.
2 – E se quiser mover ao invés de copiar? Simples!
$ rsync --remove-source-files -a *.jpg /mnt/stor
O nome do parâmetro é bem longo (–remove-source-files) e por isso torna-se dispensável muitos comentários sobre ele. Após a transferência os arquivos de origem serão excluídos.
3 – Transferir todo um diretório de um local para outro é moleza.
$ rsync -va /mnt/images/2015/ /media/backup
ou ainda
$ rsync -va /mnt/images/2015 /media/backup
Observe a sutíl diferença entre ambos os comandos.
Quando você usa uma “/” no final do caminho de origem você está copiando o conteúdo da pasta 2015. Isso seria o mesmo que usar “/mnt/images/2015/*”.
Quando você não usa a “/” no final do caminho de origem você está copiando a pasta 2015.
ps. O parâmetro -v permite visualizar os arquivos sendo transferidos. Ótimo para ansiosos e curiosos. 🙂
4 – Se ao invés de copiar para outro disco local você precisa transferir para outro computador remoto basta que ambos possuam o serviço ssh em operação (também é possível usar o serviço do próprio rsync mas isso fica pra depois).
$ rsync -va /mnt/images/2015 wbraga@maq2:/media/backup
Veja que o comando é bem similar aos anteriores. Só o que muda é no destino onde informei o meu login e a máquina onde está a pasta de backup.
Note que o login e a máquina são separados por um “@”, a máquina e o caminho são separados por “:”.
Caso você nunca tenha acessado esta máquina (maq2) por ssh com este usuário é possível que você seja solicitado a validar a troca de chaves (apenas responda “Yes”) e em seguida será solicitada a senah do usuário “wbraga” naquela máquina. Feito isso pode fazer a pausa para o café.
5 – Replicando dois diretórios. Suponhamos que você tenha um diretório que precisa ser replicado em outro local.Ou seja, se um arquivo foi adicionado no primeiro ele deverá ser adicionado no segundo, se foi excluído também deverá ser excluído no outro.
$ rsync --delete -va /srv/www/dev /srv/www/prod
Por padrão o rsync só transfere os arquivos mais novos na origem então só precisamos do parâmetro adicional “–delete” para que ele faça o mesmo com as exclusões, assim caso o Rsync detecte que há um arquivo no destino e que não possui uma cópia na origem, ele será removido.
Você poderia inclusive transferir para outro servidor como no exemplo 4, o rsync não distingui parâmetros para uso local ou remoto.
Por fim, você pode colocar este comando no cron do seu servidor para que periodicamente a cópia seja executada, desde que você possuam uma chave de autenticação para que não seja solicitada a senha. A primeira cópia certamente será demorada em razão da grande quantidade de arquivos, no entanto as demais serão bem rápidas em razão do algoritmo de transferência que o Rsync usa para transferir somente as diferenças.