Conseguir que o rsync gere um arquivo de correção em vez de copiar arquivos?

19

Estou copiando muitos arquivos que foram alterados de um servidor para outro usando o rsync. Eu sei que posso usar a -nopção para executar uma execução a seco, para que eu possa ver quais arquivos foram alterados. No entanto, é possível fazer com que o rsync imprima uma diff do conteúdo do arquivo alterado? Gostaria de ver o que está acontecendo antes de fazer uma cópia? Algo que eu posso salvar em um arquivo e aplicar com o diff (1) mais tarde?

Rory
fonte

Respostas:

8

Pode haver uma maneira melhor, mas isso pode funcionar, embora não seja tão eficiente:

 rsync -vrn / dest:/ > ~/file_list

Em seguida, edite o teste para remover as estatísticas e, em seguida:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Outra opção:
você também pode montar o sistema de arquivos com algo como sshfs / fuse e depois usar diff.

Kyle Brandt
fonte
Nota: Eu não testar os comandos ;-)
Kyle Brandt
Bom começo, mas há um monte de saída extra do rsync, como as estatísticas, e "envio de lista de arquivos incrementais", etc.
Rory
Você pode usar --out-format = "% f"
Kyle Brandt
Se você usar o out-formato, gota a v, e grep -v 'pular arquivo não-regular' ... Isso deve obtê-lo bem limpo
Kyle Brandt
Apenas verificando se, por acaso, existe um método novo / melhor para rsync --diffdois anos depois ...
Ring Ø
2

O rsync não pode fazer isso de forma nativa, mas se houver a possibilidade de usar uníssono, você poderá produzir um formato de estilo diff a partir disso.

Philip Reynolds
fonte
1

Não é possível nativamente porque o rsync se preocupa apenas com diferenças binárias entre arquivos.

Você pode criar um script usando a saída do rsync. Mas seria uma loucura.

Eu acredito que é nativamente possível com a Unison .

Dan Carley
fonte
1
Meu é o que você quis dizer com hackish? :-)
Kyle Brandt
Absolutamente, Kyle: D
Dan Carley
1

Por que não usar apenas algo como diff (para arquivos de texto) ou xdelta (para arquivos binários) para gerar as diferenças? Por que você precisa obter algo específico do rsync?

mulher
fonte
Eu não preciso de rsync, mas precisa ser remoto
Rory
Oh não, ssh!
Womble
1

Para expandir a resposta de Kyle, isso automatiza o processo. Observe que é totalmente não testado, provavelmente muito frágil, e pode excluir seu computador e matar seu cão.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')
tylerl
fonte
0

O algoritmo rsync funciona comparando pedaços binários do arquivo. Esse diff binário não deve ser impresso. Existe um comando chamado rdiff que usa o algoritmo rsync para gerar um diff binário, mas não acho que seria útil para o que você descreve, é comumente usado para implementar backups incrementais.

sagi
fonte