N방향 비교를 수행하는 방법은 무엇입니까?

N방향 비교를 수행하는 방법은 무엇입니까?

여러 명령의 출력을 어떻게 구별하나요? vimdiff최대 4개의 파일까지 지원할 수 있지만 diff자체적으로는 2개의 파일만 지원하는 것으로 보입니다.

직접 사용할 수 있는 변형이 있습니까 diff? 아니면 모든 명령의 출력을 임시 파일에 저장하고 하나를 선택하여 나머지를 비교해야 합니까?


문맥:

여러 서버에서 특정 명령의 출력을 확인하여 모두 일관성이 있는지 확인해야 합니다. 현재로서는 차이점이 발견되면 보고하는 것이 좋을 것 같지만 가능하다면 다음과 같이 말할 수 있습니다. 서버의 X%는 서로 일치하고 Y%는 서로 일치합니다. 또는 서버 Z가 이상한 서버.

4방향 다중 마스터 LDAP 설정이 있고 ContextCSN네 가지 값이 모두 서로 일치하는지 확인하고 싶습니다.

이제 나는 이렇게 합니다:

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

그리고 스크립트에서 오류 코드를 확인하세요. 더 좋은 도구가 있나요?

Ubuntu 14.04에서 사용할 수 있는 모든 도구를 환영합니다.

답변1

이를 수행하는 도구는확산. 일반적으로 저장소에서도 사용할 수 있습니다(적어도 제가 확인한 Debian 및 Arch에서는). 예상대로 작동합니다.

  diffuse file1 file2 file3 file4

등.

답변2

fdupes도구는 여러분에게 유용할 수 있습니다(저장소에 있어야 함). 비교할 파일 수가 많은 경우 이를 사용하여 어떤 파일이 이미 동일한지 식별할 수 있으므로 수행해야 하는 작업이 줄어듭니다. 아래에 설명된 대로 디렉터리 매개변수에서만 작동합니다. 비교하려는 모든 파일을 디렉터리에 넣으면 다음을 수행할 수 있습니다.

fdupes .

동일한 파일을 식별하십시오. 또는:

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

고유한 파일을 식별합니다.

diff3명령도 유용할 수 있습니다.

답변3

파일의 일관성만 확인하려는 경우에는 실제로 diff가 필요하지 않습니다. 그냥 사용하거나 sha1sum비슷한 것을 사용하십시오.

예를 들어:

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

이렇게 하면 공백으로 구분된 서버 목록, sha1sum 쌍이 제공됩니다. 동일한 sha1sum을 가진 서버는 동일한 출력을 갖습니다.

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

다음과 같이 추가 처리를 수행하여 일치하는 서버 목록을 얻을 수 있습니다.

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

출력은 다음과 같습니다.

server1 server3 server6
server2 server4
server5

관련 정보