Obter o rsync para gerar um arquivo de correção em vez de copiar arquivos?

16

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

    
por Rory 04.09.2009 / 13:02

6 respostas

7

Pode haver uma maneira melhor, mas isso pode funcionar, embora não de forma 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 considerar montar o sistema de arquivos com algo como sshfs / fuse e, em seguida, apenas usando diff.

    
por 04.09.2009 / 13:31
2

O rsync não pode fazer isso nativamente, mas se houver a possibilidade de usar uníssono você pode produzir formato de estilo de diferença a partir disso.

    
por 04.09.2009 / 13:31
1

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

Você pode fazer o script usando a saída do rsync. Mas seria hackish.

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

    
por 04.09.2009 / 13:32
1

Por que não usar apenas algo como diff (para arquivos de texto) ou xdelta (para arquivos binários) para gerar os diffs? Por que você precisa obter algo especificamente do rsync?

    
por 04.09.2009 / 13:36
1

Para expandir a resposta de Kyle, isso automatiza o processo. Note que é totalmente não testado, provavelmente muito frágil, e pode deletar 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')
    
por 23.06.2012 / 20:41
0

O algoritmo rsync funciona comparando partes binárias do arquivo. Tal diff binário não deve ser imprimível. Existe um comando chamado rdiff que usa o algoritmo rsync para gerar um diff binário, mas eu não acho que seria útil para o que você descreve, é comumente usado para implementar backups incrementais.

    
por 04.09.2009 / 13:33