¿Cómo hago una diferencia de N-way?

¿Cómo difiero la salida de múltiples commands? vimdiff puede admitir hasta cuatro files, pero el propio diff parece admitir exactamente dos files.

¿Es directamente posible con alguna variante de diff , o tengo que save la salida de todos los commands en files temporales, elegir uno y modificar el rest con él?


Context:

Tengo que verificar el resultado de un determinado command en varios serveres y ver si todos están de acuerdo. Por el momento, solo informar si se encuentran diferencias parece bueno, pero si es posible, me gustaría poder decir: los serveres X% constringn entre sí, Y% entre ellos; o ese server Z es el impar.

Tengo una configuration LDAP multimaestro de cuatro vías, y quiero verificar que los valores ContextCSN para los cuatro coincidan entre sí.

Entonces ahora lo hago:

 #! /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 

Y verifique el código de error del script. ¿Hay mejores herramientas para esto?

Cualquier herramienta que se pueda utilizar en la bienvenida de Ubuntu 14.04.

La herramienta para hacer esto es Difusa . También está generalmente disponible en los repositorys (al less en Debian y Arch, donde lo verifiqué). Funciona como usted esperaría que:

  diffuse file1 file2 file3 file4 

y así.

La herramienta fdupes puede ser de utilidad para usted aquí (debe estar en los repositorys). Si tiene una gran cantidad de files para comparar, puede usarlos para networkingucir el trabajo que tiene que hacer identificando cuáles ya son idénticos. Como se indica a continuación, solo funciona con arguments de directory. Si tiene todos los files para diff en un directory, puede hacer algo como:

 fdupes . 

Para identificar files que son lo mismo. O:

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

Para identificar files que son únicos.

El command diff3 también puede ser útil.

Si solo quiere ver si los files están de acuerdo, entonces realmente no necesita diff. Solo usa sha1sum o algo así.

por ejemplo:

 #!/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 

Esto le dará una list de serveres separados por espacios, pares sha1sum. Los serveres con el mismo sha1sum tienen el mismo resultado:

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

Puede seguir procesando para get una list de serveres coincidentes, por ejemplo:

 #!/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 

que da resultados tales como:

 server1 server3 server6 server2 server4 server5