Утилита DIFF работает для 2 файлов. Как сравнивать более 2 файлов одновременно?


86

Таким образом, утилита Diff работает так же, как я хочу, для 2 файлов, но у меня есть проект, который требует сравнения более чем с 2 файлами за раз, может быть, до 10 за раз. Для этого также необходимо, чтобы все эти файлы располагались рядом друг с другом. Мои исследования на самом деле ничего не дали, vimdiff пока что кажется лучшим со способностью сравнивать 4 за раз.

Мой вопрос: есть ли какая-либо утилита для сравнения более двух файлов за раз или способ взломать diff / vimdiff, чтобы он мог выполнять несколько сравнений? Файлы, которые я буду сравнивать, относительно короткие, поэтому они не должны быть слишком медленными.

Заранее спасибо!

Ответы:


111

Отображение 10 файлов рядом и выделение различий можно легко сделать с помощью Diffuse . Просто укажите все файлы в командной строке следующим образом:

диффузный 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt


1
Вау, это круто! Спасибо за ответ, даже поздно, мне все еще нужна была помощь.
Джавед Ахамед,

1
Как называется такое сравнение?
leeand00

4
Фантастический инструмент; просто помог мне решить досадную проблему. Я знаю, что это старый ответ, но спасибо!
SeanKilleen

Спасибо тебе тысячу раз! Очень помогло обнаружить небольшие отличия в кучке скопированных файлов.
Trass3r

1
@Gruber - я должен нажать на ссылку в неподходящее время - я удалил свой комментарий
combatc2

30

Vim уже умеет это делать:

vim -d file1 file2 file3

Но обычно вы ограничены 4 файлами. Однако вы можете изменить это, изменив одну строку в исходном коде Vim. Константа DB_COUNTопределяет максимальное количество файлов различий , и она определяется в верхней части diff.cв версиях 6.x и более ранних, или примерно на две трети меньше structs.hв версиях 7.0 и выше.


vimdiff или vim -d могут делать только 4 файла одновременно, по крайней мере, на моем компьютере. кто-нибудь знает, как это обойти?
Джавед Ахамед

Упоминания об этом в вопросе я не заметил. Обновлено, чтобы включить инструкции по изменению лимита Vim.
Ной Медлинг,

Эй, а вы знаете, как на самом деле добраться до Structs.h или diff.c? Я не могу найти исходный код vim в Win или Linux.
Джавед Ахамед 06

Похоже, что vim не может сравнивать более двух каталогов, что ограничивает его полезность. Еще одно ограничение заключается в том, что при сравнении файлов друг с другом вы можете видеть только левую часть файла, нет полос прокрутки, чтобы увидеть все. И не существует метода графического интерфейса для передачи изменений туда и обратно.
Jereme Guenther

7

diffимеет встроенную опцию --from-fileи --to-file, которая сравнивает один операнд со всеми остальными.

   --from-file=FILE1
          Compare FILE1 to all operands.  FILE1 can be a directory.

   --to-file=FILE2
          Compare all operands to FILE2.  FILE2 can be a directory.

Хотел бы я заставить это работать с заменой процесса вместо реальных путей к файлам.
Ян Кю Пеблик,

1
@JanKyuPeblik Если вы используете zsh, обратите внимание на форму подстановки процесса = (...), которая записывает вывод во временный файл и расширяется до имени этого временного файла zsh.sourceforge.net/Doc/Release/…
Эрик Freese

2

Оформление заказа "Beyond Compare": http://www.scootersoftware.com/

Он позволяет сравнивать целые каталоги файлов, и похоже, что он работает и в Linux.


1
diff -r также сравнивает целые каталоги файлов, но сравнивает файлы только из одного каталога с файлами из другого каталога
reinierpost

6
Beyond Compare - великолепный инструмент, и я постоянно использую его для разрешения конфликтов слияния. Однако это не подходящий инструмент для этой работы, так как он может сравнивать только два файла друг с другом или с общим предком.
Superole

Извините за -1, но речь идет о сравнении множества файлов друг с другом.
Manohar Reddy Poreddy 05

1

если вы запускаете несколько diff, основанных на одном файле, вы, вероятно, могли бы попробовать написать скрипт, в котором есть цикл for для запуска каждого каталога и запуска diff. Хотя это не было бы рядом, вы хотя бы могли быстро их сравнить. надеюсь, что это помогло.


да, но если бы я сравнивал, например, 3 файла, я бы хотел, чтобы все они отличались от каждого из двух других файлов, поскольку diff выполняет эту перегруппировку, чтобы увидеть, где они совпадают.
Джавед Ахамед,

Я нашел эту команду, которая может помочь с вашим скриптом, она называется diff3 и, предположительно, это утилита для сравнения трех файлов. linux.about.com/library/cmd/blcmdl1_diff3.htm версию для Windows можно найти здесь gnuwin32.sourceforge.net/packages/diffutils.htm
Бенджамин Нил

0

Не отвечая на главный вопрос, но вот что-то похожее на то, что предложил Бенджамин Нил, но с различием всех файлов:

Сохраните имена файлов в массиве, затем переберите комбинации размера два и diff (или сделайте что хотите).

files=($(ls -d /path/of/files/some-prefix.*))     # Array of files to compare
max=${#files[@]}                                  # Take the length of that array
for ((idxA=0; idxA<max; idxA++)); do              # iterate idxA from 0 to length
  for ((idxB=idxA + 1; idxB<max; idxB++)); do     # iterate idxB + 1 from idxA to length
    echo "A: ${files[$idxA]}; B: ${files[$idxB]}" # Do whatever you're here for.
  done
done

Производное от @ Карлу-Даффи «s ответ: https://stackoverflow.com/a/46719215/1160428


0

Есть простой хороший способ сделать это = GREP.

В зависимости от размера текста вы можете скопировать и вставить его или перенаправить ввод файла команде grep. Если вы сделаете grep -vir / path для обратного поиска или grep -ir / path. Это мой способ сдачи сертификационных экзаменов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.