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

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

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

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


person Javed Ahamed    schedule 02.07.2009    source источник


Ответы (7)


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

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

person Community    schedule 12.07.2009
comment
Вау, это потрясающе! Спасибо за ответ даже поздно, мне все еще нужна помощь. - person Javed Ahamed; 21.07.2009
comment
Как называется такое сравнение? - person leeand00; 21.04.2010
comment
Фантастический инструмент; только что помог мне решить неприятную проблему. Я знаю, что это старый ответ, но спасибо! - person SeanKilleen; 21.12.2010
comment
Спасибо тысячу раз! Очень помог обнаружить мелкие отличия в куче копипастенных файлов. - person Trass3r; 18.04.2013
comment
Любая идея, как я могу создать контекстное меню «Открыть с помощью», чтобы позволить мне выбирать несколько файлов и открывать их в разных панелях на одной вкладке? - person roryhewitt; 18.01.2014
comment
черт возьми, это потрясающее средство - person Matthias; 16.08.2016
comment
@combatc2 Ссылка в порядке! - person Gruber; 17.06.2018
comment
@Gruber - я, должно быть, попал по ссылке в неудачное время - я удалил свой комментарий - person combatc2; 18.06.2018
comment
@combatc2 о, извините, мой комментарий теперь вырезали, не знаю почему! Я стремился скорее к уведомлению, чем к исправлению или что-то в этом роде;) - person Gruber; 19.06.2018
comment
Это только графический инструмент? /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display - person rogerdpack; 11.01.2019
comment
@ leeand00 leeand00 Я собираюсь украсть один из git и назвать это осьминогом diff :) - person iCodeSometime; 31.01.2019
comment
Эта утилита, похоже, больше не поддерживается активно, хотя иногда кто-то вносит небольшие изменения. Тем не менее, утечки памяти приводят к довольно частым сбоям приложения в Windows 10. Мне бы это понравилось, если бы это не было такой большой проблемой. - person Jereme Guenther; 14.03.2019

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

vim -d file1 file2 file3

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

person Noah Medling    schedule 02.07.2009
comment
vimdiff или vim -d могут одновременно обрабатывать только 4 файла, по крайней мере, на моем компьютере. кто знает как это обойти? - person Javed Ahamed; 03.07.2009
comment
Я не заметил упоминания об этом в вопросе. Обновлено, чтобы включить инструкции по изменению лимита Vim. - person Noah Medling; 04.07.2009
comment
Эй, а вы знаете, как добраться до structs.h или diff.c? Я не могу найти исходный код vim на Win или Linux. - person Javed Ahamed; 06.07.2009
comment
vim, похоже, не может сравнивать каталоги для более чем двух каталогов, что ограничивает полезность. Еще одно ограничение заключается в том, что при сравнении файлов друг с другом вы можете видеть только левую часть файла, а полос прокрутки, чтобы увидеть все, нет. И нет способа с графическим интерфейсом для передачи изменений туда и обратно. - person Jereme Guenther; 14.03.2019

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.

Примечание: имя аргумента --to-file указывать необязательно. например

# this will compare foo with bar, then foo with baz .html files
$ diff  --from-file foo.html bar.html baz.html

# this will compare src/base-main.js with all .js files in git repo,
# that has 'main' in their filename or path
$ git ls-files :/*main*.js | xargs diff -u --from-file src/base-main.js
person Peacher Wu    schedule 04.03.2019
comment
Хотел бы я заставить это работать с заменой процессов вместо реальных путей к файлам. - person Jan Kyu Peblik; 13.06.2019
comment
@JanKyuPeblik Если вы используете zsh, ознакомьтесь с формой замены процесса =(...), которая записывает выходные данные во временный файл и заменяется на имя этого временного файла zsh.sourceforge.net/Doc/Release/ - person Eric Freese; 29.10.2019

Оформить заказ «Вне сравнения»: http://www.scootersoftware.com/

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

person Scott Anderson    schedule 02.07.2009
comment
diff -r также сравнивает целые каталоги файлов, но сравнивает только файлы из одного каталога с файлами из другого каталога. - person reinierpost; 21.04.2010
comment
Beyond Compare — великолепный инструмент, и я постоянно использую его для решения конфликтов слияния. Однако это не подходящий инструмент для этой работы, так как он может сравнивать только два файла друг с другом или с общим предком. - person Superole; 27.07.2017
comment
Извините за -1, но речь идет о сравнении многих файлов друг с другом. - person Manohar Reddy Poreddy; 05.01.2020

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

person Benjamin Neil    schedule 02.07.2009
comment
да, но если бы я сравнивал, например, 3 файла, я бы хотел, чтобы все они отличались от каждого из двух других файлов, поскольку diff выполняет эту перестановку, чтобы увидеть, где они совпадают. - person Javed Ahamed; 03.07.2009
comment
я нашел эту команду, которая может помочь с вашим скриптом, она называется diff3 и предположительно это утилита для сравнения трех файлов. linux.about.com/library/cmd/blcmdl1_diff3.htm версия для Windows можно найти здесь gnuwin32.sourceforge.net/packages/diffutils.htm - person Benjamin Neil; 06.07.2009

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

Сохраните имена файлов в массиве, затем переберите комбинации размера два и 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

Получено из ответа @charles-duffy: https://stackoverflow.com/a/46719215/1160428

person anask    schedule 03.07.2020

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

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

person user14565488    schedule 02.11.2020