Como eu faço um diff N-way?

14

Como diferencio a saída de vários comandos? vimdiffpode suportar até quatro arquivos, mas diffparece suportar exatamente dois arquivos.

É diretamente possível com alguma variante de diff, ou eu tenho que salvar a saída de todos os comandos em arquivos temporários, escolher um e diferenciar o restante com ele?


Contexto:

Eu tenho que verificar a saída de um determinado comando em vários servidores e ver se todos eles concordam. No momento, apenas relatar se alguma diferença é encontrada parece bom, mas se possível, eu gostaria de poder dizer: X% de servidores concordam entre si, Y% entre si; ou esse servidor Z é o estranho.

Eu tenho uma configuração LDAP multimestre de quatro vias e quero verificar se os ContextCSNvalores para todos os quatro estão de acordo.

Então agora eu faço:

#! /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 verifique o código de erro do script. Existem melhores ferramentas para isso?

Todas as ferramentas que podem ser usadas no Ubuntu 14.04 são bem-vindas.

muru
fonte

Respostas:

11

A ferramenta para fazer isso é Difusa . Também está geralmente disponível em repositórios (pelo menos no Debian e Arch, onde eu verifiquei). Funciona como você esperaria:

  diffuse file1 file2 file3 file4

e assim por diante.

MariusMatutiae
fonte
Pode ser usado para scripts?
Muru
Eu recebi vários erros de Python GTK, e a página de manual no Ubuntu 14.04 diz que é uma ferramenta gráfica, assim como a página de manual do Debian
wheezy
Parece uma ferramenta diff muito boa, provavelmente começará a usá-la. Obrigado pela dica :)
Graeme
6

A fdupesferramenta pode ser útil para você aqui (deve estar nos repositórios). Se você tiver um grande número de arquivos para comparar, poderá usá-lo para reduzir o trabalho que precisa realizar, identificando quais já são idênticos. Como observado abaixo, ele funciona apenas com argumentos de diretório. Se você tiver todos os arquivos para diferir em um diretório, poderá fazer algo como:

fdupes .

Para identificar arquivos iguais. Ou:

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

Para identificar arquivos que são únicos.

O diff3comando também pode ser útil.

Graeme
fonte
fdupesparece precisar de um diretório como argumento (facilmente contornado), mas sim, uma contagem de arquivos retornados por fdupesé muito útil.
Muru
@ muru, desculpe, perdi isso. Atualizada.
Graeme
5

Se você deseja apenas ver se os arquivos estão de acordo, não precisa realmente de diff. Basta usar sha1sumou algo assim.

por exemplo:

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

Isso fornecerá uma lista separada por espaços de servidor, pares sha1sum. Servidores com o mesmo sha1sum têm a mesma saída:

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

Você pode fazer um processamento adicional para obter uma lista de servidores correspondentes, por exemplo:

#!/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 fornece resultados como:

server1 server3 server6
server2 server4
server5
Brian Minton
fonte