Obtenez rsync pour générer un fichier correctif au lieu de copier sur plusieurs fichiers?

19

Je copie de nombreux fichiers qui ont changé d'un serveur à un autre à l'aide de rsync. Je sais que je peux utiliser l' -noption pour faire un essai à sec, donc je peux voir quels fichiers ont été modifiés. Cependant, est-il possible d'obtenir rsync pour imprimer un diff du contenu du fichier qui a changé? J'aimerais voir ce qui se passe avant d'en faire une copie? Quelque chose que je peux enregistrer dans un fichier et l'appliquer avec diff (1) plus tard?

Rory
la source

Réponses:

8

Il pourrait y avoir une meilleure façon, mais cela pourrait fonctionner, mais pas si efficacement:

 rsync -vrn / dest:/ > ~/file_list

Modifiez ensuite le test pour supprimer les statistiques, puis:

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

Une autre option:
vous pouvez également envisager de monter le système de fichiers avec quelque chose comme sshfs / fuse, puis d'utiliser simplement diff.

Kyle Brandt
la source
Remarque: je n'ai pas testé ces commandes ;-)
Kyle Brandt
Bon début, mais il y a beaucoup de sorties supplémentaires de rsync, telles que les statistiques et "l'envoi d'une liste de fichiers incrémentielle", etc.
Rory
Vous pouvez utiliser --out-format = "% f"
Kyle Brandt le
Si vous utilisez le format externe, supprimez le v, et grep -v 'en sautant le fichier non régulier' ... Cela devrait le rendre assez propre
Kyle Brandt
Je vérifie juste si par hasard il y a une nouvelle / meilleure méthode à rsync --diffdeux ans plus tard ...
Ring Ø
2

rsync ne peut pas faire cela nativement, mais s'il y a une possibilité d'utiliser unisson, vous pouvez produire un format de style diff à partir de cela.

Philip Reynolds
la source
1

Ce n'est pas possible nativement car rsync ne se soucie que des différences binaires entre les fichiers.

Vous pourrez peut-être l'écrire en utilisant la sortie de rsync. Mais ce serait hackish.

Je pense que c'est nativement possible avec Unison .

Dan Carley
la source
1
Est-ce que le mien est ce que vous entendiez par hackish :-)
Kyle Brandt
Absolument, Kyle: D
Dan Carley
1

Pourquoi ne pas simplement utiliser quelque chose comme diff (pour les fichiers texte) ou xdelta (pour les fichiers binaires) pour générer les différences? Pourquoi avez-vous besoin de retirer spécifiquement quelque chose de rsync?

womble
la source
Je n'ai pas besoin de rsync, mais il doit être distant
Rory
Oh non, ssh!
womble
1

Pour développer la réponse de Kyle, cela automatise le processus. Notez qu'il est totalement non testé, probablement assez fragile, et peut supprimer votre ordinateur et tuer votre chien.

#!/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
la source
0

L'algorithme rsync fonctionne en comparant des morceaux binaires du fichier. Une telle différence binaire n'est pas censée être imprimable. Il existe une commande appelée rdiff qui utilise l'algorithme rsync pour générer un diff binaire, mais je ne pense pas qu'elle serait utile pour ce que vous décrivez, elle est couramment utilisée pour implémenter des sauvegardes incrémentielles.

sagi
la source