Come faccio a fare una diff N-way?


14

Come diff diffondo l'output di più comandi? vimdiffpuò supportare fino a quattro file, ma diffsembra supportare esattamente due file.

È direttamente possibile con qualche variante di diff, o devo salvare l'output di tutti i comandi in file temporanei, sceglierne uno e differne il resto con esso?


Contesto:

Devo controllare l'output di un determinato comando su più server e vedere se tutti sono d'accordo. Per il momento, il solo fatto di segnalare se vengono rilevate differenze sembra buono, ma se possibile, vorrei poter dire: X% server è d'accordo, Y% tra di loro; o quel server Z è quello dispari.

Ho una configurazione LDAP multi-master a quattro vie e voglio verificare che i ContextCSNvalori per tutti e quattro siano d'accordo.

Quindi ora faccio:

#! /bin/bash

for i in {1..4}.ldap 
do 
    ldapsearch -x -LLL -H ldap://$i -s base -b dc=example,dc=com contextCSN > $i.csn; 
done
set -e 
for i in {2..4}
do
    diff -q 1.csn $i.csn
done

E controlla il codice di errore dello script. Ci sono strumenti migliori per questo?

Tutti gli strumenti che possono essere utilizzati su Ubuntu 14.04 sono i benvenuti.

Risposte:


11

Lo strumento per farlo è Diffuso . È anche generalmente disponibile da repository (almeno in Debian e Arch, dove ho controllato). Funziona come ci si aspetterebbe che:

  diffuse file1 file2 file3 file4

e così via.


Può essere usato per lo scripting?
muru,

Ricevo un sacco di errori Python GTK e la manpage su Ubuntu 14.04 dice che è uno strumento grafico, così come la manpage di Debian wheezy: manpages.debian.org/cgi-bin/…
muru

Sembra un ottimo strumento diff, probabilmente inizierò ad usarlo da solo. Grazie per la punta :)
Graeme,

6

Il fdupes strumento potrebbe esserti utile qui (dovrebbe essere nei repository). Se hai un gran numero di file da confrontare, puoi usarlo per ridurre il lavoro che devi fare identificando quali sono già identici. Come indicato di seguito, funziona solo con argomenti di directory. Se hai tutti i file da diff in una directory puoi fare qualcosa del tipo:

fdupes .

Per identificare i file che sono uguali. O:

comm -13 <(fdupes . |sort -u) <(find . -maxdepth 1 | sort)

Per identificare i file che sono unici.

Il diff3comando può anche essere utile.


fdupessembra aver bisogno di una directory come argomento (facilmente risolvibile), ma sì, un conteggio dei file restituiti fdupesè molto utile.
muru,

@muru, scusa, mi sono perso. Aggiornato.
Graeme,

5

Se vuoi solo vedere se i file sono d'accordo, non hai davvero bisogno di diff. Basta usaresha1sum o qualcosa del genere.

per esempio:

#!/bin/sh
command="foo;bar|baz"
for server in server1 server2 server3 server4 server5 server6: do
    echo $server $(ssh $server "$command" |sha1sum)
done | sort -k2 

Questo ti darà un elenco separato da spazi di server, coppie sha1sum. I server con lo stesso sha1sum hanno lo stesso output:

server1 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server3 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server6 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server2 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server4 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server5 dcdc24e139db869eb059c9355c89c382de15b987 *-

È possibile eseguire ulteriori elaborazioni per ottenere un elenco di server corrispondenti, ad esempio:

#!/bin/sh
command="foo;bar|baz"
for server in server1 server2 server3 server4 server5: do
    echo $server $(ssh $server "$command" |sha1sum)
done | sort -k2 | while read srv sum; do
    if [ "$prevsum" == "$sum" ]; then 
        echo -n " "
    else
        echo
    fi
    echo -n $srv
    prevsum=$sum
done

che fornisce output come:

server1 server3 server6
server2 server4
server5
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.