ฉันจะทำ N-way diff ได้อย่างไร


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 ยินดีต้อนรับ

คำตอบ:


11

เครื่องมือในการทำเช่นนี้คือกระจาย โดยทั่วไปแล้วยังมีให้จาก repos (อย่างน้อยก็ใน Debian และ Arch ที่ฉันตรวจสอบ) ใช้งานได้ตามที่คุณคาดหวัง:

  diffuse file1 file2 file3 file4

และอื่น ๆ


มันสามารถใช้สำหรับการเขียนสคริปต์?
muru

ฉันได้รับข้อผิดพลาด PKK GTK จำนวนมากและmanpageบน Ubuntu 14.04 บอกว่าเป็นเครื่องมือกราฟิกเช่นเดียวกับ manpage ของ Debian
wheezy

ดูเหมือนว่าเครื่องมือ diff ที่ดีจริงๆอาจจะเริ่มใช้ด้วยตัวเอง ขอบคุณสำหรับเคล็ดลับ :)
แกรม

7

fdupesเครื่องมือที่อาจจะมีการใช้งานบางอย่างให้คุณที่นี่ (ควรจะอยู่ในที่เก็บ) หากคุณมีไฟล์ที่จะทำการเปรียบเทียบจำนวนมากคุณสามารถใช้มันเพื่อลดงานที่คุณต้องทำโดยระบุว่าไฟล์ใดที่เหมือนกันอยู่แล้ว ดังที่ระบุไว้ด้านล่างใช้งานได้กับอาร์กิวเมนต์ไดเรกทอรีเท่านั้น หากคุณมีไฟล์ทั้งหมดที่จะกระจายในไดเรกทอรีเดียวคุณสามารถทำสิ่งที่ชอบ:

fdupes .

เพื่อระบุไฟล์ที่เหมือนกัน หรือ:

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

เพื่อระบุไฟล์ที่ไม่ซ้ำใคร

diff3คำสั่งนอกจากนี้ยังอาจจะมีประโยชน์


fdupesดูเหมือนว่าจะต้องการไดเรกทอรีเป็นอาร์กิวเมนต์ (แก้ไขได้ง่าย) แต่ใช่จำนวนไฟล์ที่ส่งคืนโดยfdupesมีประโยชน์มาก
muru

@muru ขอโทษที่พลาดไป Updated
แกรม

5

หากคุณต้องการดูว่าไฟล์เห็นด้วยหรือไม่คุณไม่จำเป็นต้องมีความแตกต่าง เพียงใช้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 

นี่จะให้รายการเซิร์ฟเวอร์ที่คั่นด้วยช่องว่างคู่ 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.