N yönlü fark nasıl yapabilirim?


14

Birden çok komutun çıktısını nasıl değiştirebilirim? vimdiffdört dosyaya kadar destekleyebilir, ancak diffkendisi tam olarak iki dosyayı destekliyor gibi görünüyor.

Doğrudan bazı değişkenler ile mümkün mü diff, yoksa tüm komutların çıktılarını geçici dosyalara kaydetmek, birini seçmek ve geri kalanını onunla dağıtmak zorunda mıyım?


Bağlam:

Birden fazla sunucuda belirli bir komutun çıktısını kontrol etmeli ve hepsinin aynı fikirde olup olmadığını görmeliyim. Şimdilik, sadece herhangi bir farkın bulunup bulunmadığını bildirmek iyi görünüyor, ancak mümkünse şunu söyleyebilirim:% X sunucu birbiriyle,% Y birbiriyle anlaşıyor; veya Z sunucusu garip olan sunucu.

Dört yollu bir çok ana LDAP kurulumum var ve ContextCSNdördünün de değerlerinin birbiriyle aynı olduğunu doğrulamak istiyorum .

Şimdi yapıyorum:

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

Ve komut dosyasının hata kodunu kontrol edin. Bunun için daha iyi araçlar var mı?

Ubuntu 14.04'te kullanılabilecek tüm araçlar hoş geldiniz.

Yanıtlar:


11

Bunu yapmanın aracı Dağınık . Genellikle depolardan da temin edilebilir (en azından kontrol ettiğim Debian ve Arch'da). Beklediğiniz gibi çalışır:

  diffuse file1 file2 file3 file4

ve bunun gibi.


Komut dosyası oluşturmak için kullanılabilir mi?
muru

Ben Python GTK hataların bir demet almak ve manpage olarak Debian yapar Ubuntu 14.04 üzerinde bir grafik aracı olduğunu söylüyor hışıltılı 's manpage: manpages.debian.org/cgi-bin/...
muru

Bu gerçekten iyi bir fark aracı gibi görünüyor, muhtemelen kendim kullanmaya başlayacağım. Tavsiye için teşekkürler :)
Graeme

7

fdupesAracı (Depolardaki olmalı) burada sizin için bazı yararlı olabilir. Karşılaştırılacak çok sayıda dosyanız varsa, hangilerinin zaten aynı olduğunu belirleyerek yapmanız gereken işi azaltmak için kullanabilirsiniz. Aşağıda belirtildiği gibi, yalnızca dizin bağımsız değişkenleriyle çalışır. Tek bir dizine yayılacak tüm dosyalara sahipseniz aşağıdaki gibi bir şey yapabilirsiniz:

fdupes .

Aynı dosyaları tanımlamak. Veya:

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

Benzersiz dosyaları tanımlamak.

diff3Komut da yararlı olabilir.


fdupesargüman olarak bir dizine ihtiyaç duyuyor gibi görünüyor (kolayca çalışabilir), ancak evet, döndürülen dosya sayısı fdupesçok yararlıdır.
muru

muru, özür dilerim, bunu özledim. Güncellenmiş.
Graeme

5

Sadece dosyaların aynı fikirde olup olmadığını görmek istiyorsanız, gerçekten fark gerekmez. Sadece kullansha1sum ya da bunun gibi bir şey.

Örneğin:

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

Bu size boşlukla ayrılmış bir sunucu listesi, sha1sum çiftleri verecektir. Aynı sha1sum değerine sahip sunucular aynı çıkışa sahiptir:

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

Eşleşen sunucuların bir listesini almak için daha fazla işlem yapabilirsiniz, örneğin:

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

hangi çıktı verir gibi:

server1 server3 server6
server2 server4
server5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.