Bagaimana saya melakukan diff N-way?

14

Bagaimana cara membedakan output dari banyak perintah? vimdiffdapat mendukung hingga empat file, tetapi diffitu sendiri tampaknya mendukung tepat dua file.

Apakah mungkin secara langsung dengan beberapa varian diff, atau apakah saya harus menyimpan output dari semua perintah ke file sementara, memilih satu dan berbeda dengan yang lain?


Konteks:

Saya harus memeriksa output dari perintah tertentu pada beberapa server dan melihat apakah mereka semua setuju. Untuk saat ini, hanya melaporkan jika ada perbedaan yang ditemukan tampaknya baik, tetapi jika mungkin, saya ingin dapat mengatakan: X% server setuju satu sama lain, Y% satu sama lain; atau server Z adalah yang aneh.

Saya memiliki pengaturan multi-master LDAP empat arah, dan saya ingin memverifikasi bahwa ContextCSNnilai - nilai untuk keempatnya sepakat satu sama lain.

Jadi sekarang saya lakukan:

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

Dan periksa kode kesalahan skrip. Apakah ada alat yang lebih baik untuk ini?

Semua alat yang dapat digunakan pada Ubuntu 14.04 diterima.

muru
sumber

Jawaban:

11

Alat untuk melakukan ini adalah Diffuse . Ini juga umumnya tersedia dari repo (setidaknya di Debian dan Arch, tempat saya memeriksa). Ini berfungsi seperti yang Anda harapkan:

  diffuse file1 file2 file3 file4

dan seterusnya.

MariusMatutiae
sumber
Bisakah itu digunakan untuk skrip?
muru
Saya mendapatkan banyak kesalahan Python GTK, dan halaman manual di Ubuntu 14.04 mengatakan ini adalah alat grafis, seperti halnya halaman manual
Debian wheezy
Ini terlihat seperti alat diff yang sangat bagus, mungkin akan mulai menggunakannya sendiri. Terima kasih atas tipnya :)
Graeme
6

The fdupesalat mungkin berguna bagi Anda di sini (harus dalam repositori). Jika Anda memiliki banyak file untuk dibandingkan, Anda dapat menggunakannya untuk mengurangi pekerjaan yang harus Anda lakukan dengan mengidentifikasi mana yang sudah identik. Seperti disebutkan di bawah, ini hanya berfungsi dengan argumen direktori. Jika Anda memiliki semua file yang berbeda di satu direktori, Anda dapat melakukan sesuatu seperti:

fdupes .

Untuk mengidentifikasi file yang sama. Atau:

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

Untuk mengidentifikasi file yang unik.

The diff3perintah juga dapat berguna.

Graeme
sumber
fdupestampaknya membutuhkan direktori sebagai argumen (mudah dikerjakan), tetapi ya, jumlah file yang dikembalikan fdupessangat berguna.
muru
@uru, maaf, ketinggalan itu. Diperbarui.
Graeme
5

Jika Anda hanya ingin melihat apakah file-file tersebut setuju, maka Anda tidak benar-benar perlu diff. Gunakan saja sha1sumatau semacamnya.

contohnya:

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

Ini akan memberi Anda daftar server yang terpisah ruang, sha1sum pasangan. Server dengan sha1sum yang sama memiliki output yang sama:

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

Anda dapat melakukan pemrosesan lebih lanjut untuk mendapatkan daftar server yang cocok, misalnya:

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

yang menghasilkan output seperti:

server1 server3 server6
server2 server4
server5
Brian Minton
sumber