如何进行 N 向差异?

mur*_*uru 15 scripting diff

如何区分多个命令的输出?vimdiff最多可以支持四个文件,但diff它本身似乎正好支持两个文件。

是否可以直接diff使用 .


语境:

我必须在多台服务器上检查某个命令的输出,看看它们是否都同意。目前,仅报告是否发现任何差异似乎很好,但如果可能的话,我想能够说:X% 服务器彼此同意,Y% 彼此同意;或者那个服务器 Z 是奇怪的。

我有一个四路多主 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
Run Code Online (Sandbox Code Playgroud)

并检查脚本的错误代码。有没有更好的工具?

欢迎任何可以在 Ubuntu 14.04 上使用的工具。

Mar*_*iae 12

执行此操作的工具是Diffuse。它通常也可以从 repos 获得(至少在我检查过的 Debian 和 Arch 中)。它的工作原理与您期望的一样:

  diffuse file1 file2 file3 file4
Run Code Online (Sandbox Code Playgroud)

等等。


Gra*_*eme 8

fdupes工具可能对您有用(应该在存储库中)。如果您有大量要比较的文件,您可以使用它通过识别哪些文件已经相同来减少您必须做的工作。如下所述,它仅适用于目录参数。如果您将所有文件都放在一个目录中,您可以执行以下操作:

fdupes .
Run Code Online (Sandbox Code Playgroud)

识别相同的文件。或者:

comm -13 <(fdupes . |sort -u) <(find . -maxdepth 1 | sort)
Run Code Online (Sandbox Code Playgroud)

识别唯一的文件。

diff3命令也可能有用。


Bri*_*ton 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 
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个以空格分隔的服务器列表,sha1sum 对。具有相同 sha1sum 的服务器具有相同的输出:

server1 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server3 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server6 55ca6286e3e4f4fba5d0448333fa99fc5a404a73 *-
server2 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server4 d961c3de6d6c99429806ae3d6d03f316a1168ac6 *-
server5 dcdc24e139db869eb059c9355c89c382de15b987 *-
Run Code Online (Sandbox Code Playgroud)

您可以进行进一步处理以获取匹配服务器的列表,例如:

#!/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
Run Code Online (Sandbox Code Playgroud)

这给出了输出,如:

server1 server3 server6
server2 server4
server5
Run Code Online (Sandbox Code Playgroud)