web-dev-qa-db-fra.com

compare le contenu de deux répertoires sur un serveur distant avec unix

Je suis nouveau sur Unix et j'ai besoin d'aide ici ..__ J'ai deux répertoires sur deux serveurs différents. les deux répertoires contiennent les mêmes fichiers. Maintenant, je veux vérifier si tous les fichiers sont synchronisés dans les deux répertoires. Si les fichiers ne sont pas synchronisés, je souhaite afficher uniquement le nom de ces fichiers . Je peux le faire lorsque les répertoires se trouvent sur le même serveur pas capable de comprendre comment faire cela lorsque des répertoires sont présents sur deux serveurs différents.

eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/

ici, je veux que seuls les noms de fichiers soient affichés s’ils ne sont pas synchronisés.

Merci d'avance

22
DSD

Vous pouvez utiliser rsync avec l'indicateur -n pour savoir si les fichiers sont synchronisés, sans effectuer de synchronisation.

Par exemple, à partir de server1 :

rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/

Ceci imprimera les noms de tous les fichiers (récursifs, avec l'indicateur -r) qui diffèrent entre server1:/abc/home/sample1/ et server2:/abc/home/sample2/.

rsync explication des paramètres utilisés

-n, --dry-run - effectuer un essai sans modifications

-a, --archive - mode archive; est égal à -rlptgoD (no -H, -A, -X)

-v, --verbose - augmente la verbosité

-r, --recursive - recurse dans des répertoires

-c, --checksum - Sauter en fonction de la somme de contrôle, pas de la durée et de la taille du mod

56
kielni

Sur le serveur1:

cd /abc/home/sample1/ && diff --side-by-side --suppress-common-lines <(find . -type f|xargs stat --printf "%s\t%n\n"|sort -n) <(ssh server2 "cd /abc/home/sample2/ && find . -type f|xargs stat --printf \"%s\t%n\n\"|sort -n")

C'est assez rapide mais probablement pas aussi précis que rsync puisqu'il utilise la taille du fichier au lieu du hachage de contenu. De plus, la réponse de rsync de kielni ne montrera rien si server2 a plus de fichiers que server1. Essayez plutôt ceci:

rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/
6
AXE-Labs

En cas d'absence de connectivité entre deux serveurs, utilisez la commande "tree" pour obtenir la structure de répertoires dans les fichiers, puis diff deux fichiers.

0
gopuvp

J'utilise toujours rsync -avcn pour ces tâches - je suis un fan de la CLI. L'idée est de faire un "essai" (-n), qui montre ce qui aurait été fait sans copier réellement aucun fichier ni y apporter de modification. Utiliser le commutateur -c est vraiment important car il utilise la somme de contrôle plutôt que la date de modification ou la taille du fichier pour déterminer si les fichiers sont différents. -a s'assure que la comparaison est plus approfondie et oblige le programme à plonger dans les sous-répertoires. Enfin, -v augmente le niveau de verbosité, ce qui est utile dans le cas où différents fichiers sont trouvés.

Donc, une solution possible va quelque chose comme ceci:

rsync -avcn source_dir/ dest_dir/

et rsync affichera les noms des fichiers différents entre les deux répertoires. Notez les barres obliques finales - elles sont essentielles.

Cependant:

  1. s'il y a beaucoup de fichiers différents, la liste remplit bientôt l'écran du terminal et devient difficile à lire. Dans ce cas, il est préférable de rediriger la sortie vers un fichier: rsync -avcn source_dir/ dest_dir/ > diffs.txt
  2. cela peut sembler idiot, mais n'oubliez pas d'échapper aux espaces si le répertoire source ou de destination en contient. Vous pouvez également les placer entre guillemets. rsync -avcn /src/My Dir/ dest/My dir/ n'est pas ce que vous voulez; vous devriez plutôt utiliser rsync -avcn /src/My\ Dir/ dest/My\ Dir/ ou peut-être rsync -avcn /src/"My Dir"/ dest/"My Dir"/. Ce point est particulièrement valable pour les montages Windows.
0
data.dude