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?

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.


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.



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 .


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?


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.