Làm thế nào để tôi làm một khác biệt N-way?


14

Làm thế nào để tôi khác đầu ra của nhiều lệnh? vimdiffcó thể hỗ trợ tối đa bốn tệp, nhưng diffdường như chính nó hỗ trợ chính xác hai tệp.

Có thể trực tiếp với một số biến thể của diff, hoặc tôi phải lưu đầu ra của tất cả các lệnh vào các tệp tạm thời, chọn một và khác phần còn lại với nó?


Bối cảnh:

Tôi phải kiểm tra đầu ra của một lệnh nhất định trên nhiều máy chủ và xem liệu tất cả chúng có đồng ý không. Hiện tại, chỉ báo cáo nếu có bất kỳ sự khác biệt nào có vẻ tốt, nhưng nếu có thể, tôi muốn có thể nói: X% máy chủ đồng ý với nhau, Y% với nhau; hoặc máy chủ Z là số lẻ.

Tôi có một thiết lập LDAP đa chủ bốn chiều và tôi muốn xác minh rằng các ContextCSNgiá trị cho cả bốn đồng ý với nhau.

Vì vậy, bây giờ tôi làm:

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

Và kiểm tra mã lỗi của tập lệnh. Có công cụ tốt hơn cho việc này?

Bất kỳ công cụ nào có thể được sử dụng trên Ubuntu 14.04 đều được chào đón.

Câu trả lời:


11

Công cụ để làm điều này là Diffuse . Nó cũng thường có sẵn từ repos (ít nhất là trong Debian và Arch, nơi tôi đã kiểm tra). Nó hoạt động như bạn mong đợi:

  diffuse file1 file2 file3 file4

và như thế.


Nó có thể được sử dụng cho kịch bản?
muru

Tôi nhận được một loạt các lỗi GTK của Python và trang này trên Ubuntu 14.04 nói rằng đó là một công cụ đồ họa, cũng như manpage của Debian wheezy: manpages.debian.org/cgi-bin/iêu
muru 24/12/14

Điều này trông giống như một công cụ khác biệt thực sự tốt, có thể sẽ bắt đầu sử dụng nó cho mình. Cảm ơn vì tiền boa :)
Graeme

6

Công fdupescụ này có thể được sử dụng cho bạn ở đây (nên có trong kho). Nếu bạn có một số lượng lớn các tệp để so sánh, bạn có thể sử dụng nó để giảm bớt công việc bạn phải làm bằng cách xác định những tệp nào đã giống hệt nhau. Như đã lưu ý dưới đây, nó chỉ hoạt động với các đối số thư mục. Nếu bạn có tất cả các tệp để tìm khác nhau trong một thư mục, bạn có thể làm một cái gì đó như:

fdupes .

Để xác định các tập tin giống nhau. Hoặc là:

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

Để xác định các tập tin là duy nhất.

Các diff3lệnh cũng có thể hữu ích.


fdupesdường như cần một thư mục làm đối số (dễ dàng làm việc xung quanh), nhưng vâng, một số lượng tệp được trả về fdupeslà rất hữu ích.
muru

@muru, xin lỗi, đã bỏ lỡ điều đó. Cập nhật.
Graeme

5

Nếu bạn chỉ muốn xem nếu các tập tin đồng ý, thì bạn không thực sự cần diff. Chỉ cần sử dụng sha1sumhoặc một cái gì đó như thế.

ví dụ:

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

Điều này sẽ cung cấp cho bạn một danh sách các máy chủ, các cặp sha1sum được phân tách bằng dấu cách. Các máy chủ có cùng sha1sum có cùng một đầu ra:

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

Bạn có thể xử lý thêm để có danh sách các máy chủ phù hợp, ví dụ:

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

cung cấp đầu ra như:

server1 server3 server6
server2 server4
server5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.