N-way diffを実行するにはどうすればよいですか?


14

複数のコマンドの出力をどのように比較しますか?vimdiff最大4つのファイルをサポートできますが、それdiff自体はちょうど2つのファイルをサポートしているようです。

のバリアントで直接可能ですかdiff、すべてのコマンドの出力を一時ファイルに保存し、1つを選択して残りをそれと比較する必要がありますか?


環境:

複数のサーバーで特定のコマンドの出力を確認し、それらすべてが一致するかどうかを確認する必要があります。現時点では、違いが見つかった場合に報告するだけで良いように思えますが、可能であれば、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で使用できるすべてのツールを歓迎します。

回答:


11

これを行うツールはDiffuseです。また、一般にリポジトリから入手できます(少なくともDebianとArchではチェックしました)。期待どおりに機能します:

  diffuse file1 file2 file3 file4

等々。


スクリプトに使用できますか?
ムル

私は、Python GTKエラーの束を取得し、マニュアルページのUbuntu 14.04には、それはグラフィカルなツールだと言う、などのDebian喘鳴のマンページを行います。manpages.debian.org/cgi-bin/...
muru

これは本当に良いdiffツールのように見えますが、おそらく自分で使い始めるでしょう。ヒントをありがとう:)
Graeme 14

6

このfdupesツールは、ここで役に立つかもしれません(リポジトリにあるはずです)。比較するファイルが大量にある場合は、どのファイルが既に同一であるかを特定することにより、作業を軽減するためにそれを使用できます。以下に示すように、ディレクトリ引数でのみ機能します。1つのディレクトリですべてのファイルを比較する場合は、次のようなことができます。

fdupes .

同じファイルを識別するため。または:

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

一意のファイルを識別するため。

このdiff3コマンドも役立つ場合があります。


fdupes引数としてディレクトリが必要なようですが(簡単に回避できます)、はい、返されたファイルの数fdupesは非常に便利です。
ムル14

@muru、すみません、見逃しました。更新しました。
Graeme

5

ファイルが一致するかどうかだけを確認したい場合は、実際に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 

これにより、スペースで区切られたserver、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.