Como sincronizar duas pastas com ferramentas de linha de comando?

36

Tendo migrado para o Linux do Windows, eu gostaria de encontrar um software alternativo para o Winmerge ou melhor, aprender ferramentas de linha de comando para comparar e sincronizar duas pastas no Linux. Eu ficaria grato se você pudesse me dizer como fazer as seguintes tarefas na linha de comando ... (Eu estudei o diff e o rsync, mas ainda preciso de ajuda.)

Temos duas pastas: "/ home / user / A" e "/ home / user / B"

Pasta A é o local onde arquivos e pastas comuns são salvos e a pasta B é uma pasta de backup que serve como um espelho completo da pasta A. (Nada é salvo diretamente ou modificado pelo usuário na pasta B.)

Minhas perguntas são:

  • Como listar arquivos que existem somente na pasta B? (Por exemplo, os excluídos da pasta A desde a última sincronização).

  • Como copiar arquivos que existem na única pasta B de volta para a pasta A?

  • Como listar arquivos que existem em ambas as pastas, mas com timestamps ou tamanhos diferentes? (Os que foram modificados na pasta A desde a última sincronização. Eu gostaria de evitar o uso de checksums, porque há dezenas de milhares de arquivos e isso tornaria o processo muito lento.)

  • Como fazer uma cópia exata da pasta A na pasta B? Quer dizer, copie tudo da pasta A para a pasta B que existe apenas na pasta A e exclua tudo da pasta B que existe apenas na pasta B, mas sem tocar nos arquivos que são os mesmos em ambas as pastas.

por akopacsi 16.05.2015 / 22:49

4 respostas

55
rsync -avu --delete "/home/user/A" "/home/user/B"

Explicação por SonicARG

-a Faz a sincronização preservando todos os atributos do sistema de arquivos

-v é executado com detalhes

-u pula arquivos que são mais recentes no receptor

--delete exclui os arquivos na pasta de destino que não existem na origem, / home / user / A: pasta de origem, / home / user / B: pasta de destino

    
por 17.05.2015 / 00:04
4

Você poderia usar a ferramenta unison desenvolvida por Benjamin Pierce na U Penn.

Vamos supor que você tenha dois diretórios,

/home/user/Documents/dirA/ e /home/user/Documents/dirB/

Para sincronizar esses dois, você pode usar:

~ $ unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

Na saída, unison exibirá cada diretório e arquivo diferente nos dois diretórios solicitados para sincronização. Ele recomendará a sincronização adicional (replicação de arquivos ausentes nos dois locais) na execução inicial, criará e manterá uma árvore de sincronização em sua máquina e, em execuções subseqüentes, implementará a sincronização verdadeira (ou seja, se você excluir um arquivo de .../dirA , ele também será excluído de .../dirB .Você também pode comparar todas as mudanças e optar por encaminhar ou reverter a sincronização entre os dois diretórios.

Opcionalmente, para ativar a interface gráfica, simplesmente remova a opção -ui text do seu comando, embora eu ache o cli mais simples e rápido de usar.

Mais sobre isso: Tutorial do Unison na documentação do usuário do Unison .

    
por 02.02.2017 / 09:21
0

Isto não é completamente o mesmo que você pede, mas você pode considerar usar uma ferramenta de controle de versão. Ferramentas como o Git fazem tudo o que você pede, e mais, especialmente se você não trabalha diretamente na pasta B, pode ser interessante dar uma olhada nele. você pode encontrar mais informações sobre git aqui

    
por 16.05.2015 / 23:21
0

Você pode usá-lo desta maneira:

rsync -avu --delete /home/user/A/* /home/user/B/

Desta forma, você copiará o conteúdo da pasta A para a pasta B, não o conteúdo da própria pasta A.

    
por 24.09.2018 / 17:38