Sincronize duas pastas locais no bash

23

Eu tenho uma grande pasta "X" no meu diretório pessoal e uma cópia desatualizada em uma unidade flash - Y. Qual é o análogo rm Y; cp X Y, mas sem substituir os arquivos já existentes?

Jofsey
fonte

Respostas:

26

Há muito mais propriedades para rsync do que a resposta anterior menciona. Você deve examiná-los você mesmo:

man rsync

Mas, para o seu problema, sugiro:

rsync -a --delete X Y

Dessa forma, o receptor (Y) excluirá qualquer arquivo que não esteja no X. Certifique-se de fazer o procedimento corretamente. Usado incorretamente como root, pode facilmente matar o seu sistema ... :)

Mattias Åslund
fonte
1
Concorde que você deve ter muito cuidado com isso. Tente adicionar --dry-run ao comando para ver o que acontecerá sem realmente fazer alterações. Se ela vai bem fazer o mesmo comando sem --dry-run
squarecandy
Uma pequena correção que me levou um tempo para chegar: rsync -a --delete X/ Y. Essa pequena barra após o X fez com que funcionasse como pretendido para mim, de modo que poderia ajudar outros também. Explicado aqui: abbeyworkshop.com/howto/unix/nix_rsync/index.html
Shovalt
15

Dê uma olhada no rsync (1) . Ele pretende fazer exatamente o que você deseja.

rsync -av X Y

Ele suporta cópia remota, através de seu próprio protocolo ou ssh, mas também pode ser usado localmente.

Dependendo do comportamento exato desejado, você também pode passar a --updateopção. Isso instruirá o rsync a não substituir arquivos que já existem no destino e são mais novos que os da fonte.

Se você deseja remover arquivos extras (ou seja, arquivos que existem em Y, mas não em X), você pode adicionar a --deleteopção.

Kristof Provost
fonte
Mas ele não removerá arquivos do que os removidos no X, enquanto o removerá rm Y; cp X Y.
Para remover os arquivos removidos do X, use a opção --delete.
csonuryilmaz
0

Tente usar o rsnyc, possivelmente com o seguinte comando:

rsync -avzu /home/x /y

-u = não sobrescreva um arquivo no destino, se ele for modificado

bwDraco
fonte
Mas ele não removerá arquivos do que os removidos no X, enquanto o removerá rm Y; cp X Y.
0

Eu acho que algumas das funcionalidades que você está procurando na opção -u (atualização) realmente existem nesta opção:

"--ignore-existente" - pula a atualização de arquivos existentes no receptor

promet
fonte