N-way diff는 어떻게합니까? X % 서버는 서로 동의하고 Y

여러 명령의 출력을 어떻게 다른가요? vimdiff최대 4 개의 파일 diff을 지원할 수 있지만 자체적으로 정확히 2 개의 파일을 지원하는 것 같습니다.

의 일부 변형으로 직접 가능 diff합니까, 아니면 모든 명령의 출력을 임시 파일에 저장하고 하나를 선택하고 나머지를 diff해야합니까?


문맥:

여러 서버에서 특정 명령의 출력을 확인하고 모두 동의하는지 확인해야합니다. 현재로서는 차이점이 발견되면보고하는 것이 좋을 것 같지만 가능하다면 X % 서버는 서로 동의하고 Y %는 서로 동의합니다. 또는 서버 Z가 홀수입니다.

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

이제는 다음을 수행합니다.

#! /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에서 사용할 수있는 도구는 모두 환영합니다.



답변

이를 수행하는 도구는 Diffuse 입니다. 일반적으로 repos (적어도 Debian and Arch에서 확인했습니다)에서 사용할 수 있습니다. 예상대로 작동합니다.

  diffuse file1 file2 file3 file4

등등.


답변

fdupes도구는 여기서 유용 할 수 있습니다 (리포지토리에 있어야 함). 비교할 파일 수가 많은 경우이 파일을 사용하여 이미 동일한 파일을 식별하여 수행해야하는 작업을 줄일 수 있습니다. 아래에서 언급했듯이 디렉토리 인수로만 작동합니다. 하나의 디렉토리에 diff 할 모든 파일이 있으면 다음과 같이 할 수 있습니다.

fdupes .

동일한 파일을 식별합니다. 또는:

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

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

diff3명령은 또한 유용 할 수 있습니다.


답변

파일이 일치하는지 확인하고 싶다면 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


답변