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?

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.


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.



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 .


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?


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')

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.