2017-09-05 11 views
0

Existe-t-il un moyen de différencier le contenu de plusieurs répertoires au lieu de deux répertoires? Ou diff un seul répertoire sur plusieurs hôtes. J'ai écrit le script bash suivant pour diff un répertoire sur trois hôtescomparer plusieurs répertoires sur des hôtes distants

#!/bin/bash 

if [[ -n "$(diff <(ssh [email protected] ls -r /user/test1) <(ssh [email protected] ls -r /user/test1))" || -n "$(diff <(ssh [email protected] ls -r /user/test1) <(ssh [email protected] ls -r /user/test1))" ]]; then 
    echo "There are differences" 
fi 

Y at-il une meilleure façon de le faire?

+0

diff lui-même ne fonctionne que sur deux à la fois. https://stackoverflow.com/questions/572237/whats-the-best-three-way-merge-tool –

+0

merci. Je me demande simplement s'il existe une meilleure façon de comparer plusieurs répertoires à l'aide d'une commande. – pdna

+0

dépend de ce que vous voulez trouver. Si 'diff' fonctionne, alors je ne chercherais pas plus loin. Bonne chance. – shellter

Répondre

2

Oui, GNU diff a une option --from-file qui permet la comparaison d'un fichier de référence ou un répertoire à beaucoup d'autres.

diff -r --from-file=ref-dir dir1 dir2 ... dirN 

Notez qu'il ne comparera ref-dir à dir1, ..., dirN; il ne compare pas dir1 à dir2, ..., dirN. Comme pour vos répertoires distants, puisque vous avez un accès ssh aux machines, vous pouvez les monter localement avec sshfs afin d'exécuter diff par-dessus.

2

Vous pouvez utiliser des sommes de contrôle MD5 pour les listes de fichiers pour chaque hôte. Cela vous permettra d'utiliser le même script pour différents comptes de serveurs. Si les listes sont identiques, vous devriez recevoir les mêmes valeurs pour les sommes de contrôle. Et puis vous comparez simplement toutes les sommes avec la précédente. Si elle diffère de toute autre somme de contrôle, alors vous avez des différences.

#!/bin/bash 

MD5SUMS=$(
for hostname in host{1,2,3} 
do 
    result=$(ssh [email protected]${hostname} ls -r /user/test1 | md5sum) 
    result=${result%% *} 
done 
) 

PREVSUM="" 
for SUM in ${MD5SUMS} 
do 
    if [ -z "$PREVSUM" ] 
    then 
     PREVSUM=$SUM 
     continue 
    else 
     if [ "$PREVSUM" != "$SUM" ] 
     then 
      echo "There are differences" 
     fi 
     PREVSUM=$SUM 
    fi 
done