Як мені зробити 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, вітаються.

Відповіді:


11

Інструментом для цього є Diffuse . Він також доступний у репостах (принаймні, в Debian та Arch, де я перевірив). Він працює так, як ви цього очікували:

  diffuse file1 file2 file3 file4

і так далі.


Чи можна його використовувати для сценаріїв?
муру

Я отримую купу помилок Python GTK, а сторінка керівництва по Ubuntu 14.04 каже , що це графічний інструмент, як це робить Debian свистячих'S сторінка керівництво: manpages.debian.org/cgi-bin / ...
Мура

Це схоже на дійсно хороший розрізний інструмент, напевно, почну його використовувати сам. Дякую за підказку :)
Graeme

7

fdupesІнструмент може бути корисний для вас тут (має бути в сховищах). Якщо у вас є велика кількість файлів для порівняння, ви можете скористатися нею, щоб зменшити роботу, визначивши, які з них вже однакові. Як зазначено нижче, він працює лише з аргументами каталогу. Якщо у вас є всі файли, що відрізняються в одному каталозі, ви можете зробити щось на кшталт:

fdupes .

Визначити однакові файли. Або:

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

Визначити унікальні файли.

diff3Команда може також бути корисною.


fdupesМабуть, потрібен каталог як аргумент (легко обробляється), але так, кількість файлів, повернених fdupesдуже корисно.
муру

@muru, вибачте, це пропустив. Оновлено.
Graeme

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.