我如何做N向差异?


14

如何区分多个命令的输出?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

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

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

Answers:


11

做到这一点的工具是Diffuse。它通常也可以从repos中获得(至少在我检查过的Debian和Arch中)。它可以像您期望的那样工作:

  diffuse file1 file2 file3 file4

等等。


可以用于脚本编写吗?
muru 2014年

我得到了一堆Python的GTK的错误,并且手册页在Ubuntu 14.04说,这是一个图形化的工具一样,Debian的喘息的手册页:manpages.debian.org/cgi-bin/...
穆鲁

这看起来像一个非常好的差异化工具,可能自己会开始使用。感谢您的提示:)
Graeme 2014年

7

fdupes工具可能在这里对您有用(应该在存储库中)。如果要比较的文件数量很多,可以使用它来识别必须相同的文件,从而减少要做的工作。如下所述,它仅适用于目录参数。如果您要在一个目录中比较所有文件,则可以执行以下操作:

fdupes .

识别相同的文件。要么:

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

识别唯一的文件。

diff3命令也可能有用。


fdupes似乎需要一个目录作为参数(很容易解决),但是是的,计数返回的文件fdupes非常有用。
muru 2014年

@muru,对不起,错过了。更新。
Graeme 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.