¿Cómo hago un diferencial N-way?

14

¿Cómo difiero la salida de múltiples comandos? vimdiffpuede admitir hasta cuatro archivos, pero diffparece admitir exactamente dos archivos.

¿Es directamente posible con alguna variante de diff, o tengo que guardar la salida de todos los comandos en archivos temporales, elegir uno y difundir el resto con él?


Contexto:

Tengo que verificar la salida de un determinado comando en varios servidores 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: X% de los servidores están de acuerdo entre sí, Y% entre sí; o ese servidor Z es el extraño.

Tengo una configuración LDAP multimaestro de cuatro vías y quiero verificar que los ContextCSNvalores de 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 usar en Ubuntu 14.04 es bienvenida.

muru
fuente

Respuestas:

11

La herramienta para hacer esto es Difusa . También está generalmente disponible desde repos (al menos en Debian y Arch, donde verifiqué). Funciona como es de esperar:

  diffuse file1 file2 file3 file4

y así.

MariusMatutiae
fuente
¿Se puede usar para scripting?
muru
Recibo muchos errores de Python GTK, y la página de manual de Ubuntu 14.04 dice que es una herramienta gráfica, al igual que la página de manual de
muru
Esto parece una muy buena herramienta diff, probablemente comenzaré a usarla yo mismo. Gracias por el consejo :)
Graeme
6

La fdupesherramienta puede serle útil aquí (debe estar en los repositorios). Si tiene una gran cantidad de archivos para comparar, puede usarlos para reducir el trabajo que tiene que hacer al identificar cuáles ya son idénticos. Como se indica a continuación, solo funciona con argumentos de directorio. Si tiene todos los archivos para diferenciar en un directorio, puede hacer algo como:

fdupes .

Para identificar archivos que son iguales. O:

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

Para identificar archivos que son únicos.

El diff3comando también puede ser útil.

Graeme
fuente
fdupesparece necesitar un directorio como argumento (se puede solucionar fácilmente), pero sí, un recuento de archivos devueltos por fdupeses muy útil.
muru
@muru, lo siento, me perdí eso. Actualizado.
Graeme
5

Si solo desea ver si los archivos están de acuerdo, entonces realmente no necesita diff. Solo usa sha1sumo 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 lista separada por espacios de pares de servidores, sha1sum. Los servidores con el mismo sha1sum tienen la misma salida:

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

Puede realizar un procesamiento adicional para obtener una lista de servidores 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 salida como:

server1 server3 server6
server2 server4
server5
Brian Minton
fuente