Утиліта DIFF працює для 2 файлів. Як порівняти більше 2 файлів одночасно?


84

Отже, утиліта Diff працює так само, як я хочу для 2 файлів, але у мене є проект, який вимагає порівняння з більш ніж 2 файлами одночасно, можливо, до 10 одночасно. Для цього також потрібно мати усі ці файли поруч один з одним. Моє дослідження насправді нічого не виявило, Vimdiff здається найкращим на сьогоднішній день з можливістю порівняти 4 за раз.

Моє запитання: Чи існує якась утиліта для порівняння більше 2 файлів одночасно, або спосіб зламати 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
Ого, це чудово! Дякую за відповідь навіть пізно, мені все одно потрібна допомога.
Javed Ahamed

1
Як називається таке порівняння?
leeand00,

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

Дякую тисячу разів! Дуже допомогло з’ясувати невеликі відмінності в купі копійованих файлів.
Trass3r

1
@Gruber - Я повинен негайно натиснути на посилання - Я видалив свій коментар
combatc2

28

Vim вже може це зробити:

vim -d file1 file2 file3

Але ви зазвичай обмежуєтесь 4 файлами. Однак ви можете змінити це, змінивши один рядок у джерелі Vim. Константа DB_COUNTвизначає максимальне число дифф ред файлів, і це визначено в верхній частині diff.cв версії 6.x і вище, або приблизно дві третини шляху вниз structs.hв версії 7.0 і вище.


vimdiff або vim -d може робити лише 4 файли одночасно, принаймні на моєму комп'ютері. хтось знає, як це обійти?
Javed Ahamed

Я не помітив згадки про це у питанні. Оновлено, щоб включити інструкції щодо зміни ліміту Vim.
Ной Медлінг

Гей, ти знаєш, як насправді дістатися до structs.h або diff.c? Я не можу знайти вихідний код vim на Win або Linux.
Javed Ahamed

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/…
Ерік фриз

2

Оформити замовлення "Крім порівняння": http://www.scootersoftware.com/

Це дозволяє порівнювати цілі каталоги файлів, і схоже, що він працює і на Linux.


1
diff -r також порівнює цілі каталоги файлів, але лише коли-небудь порівнює файли з одного каталогу з файлами з іншого каталогу
reinierpost

6
Beyond Compare - це чудовий інструмент, і я постійно використовую його для вирішення конфліктів злиття. Однак це не правильний інструмент для цієї роботи, оскільки він може порівняти лише два файли між собою або проти загального предка.
Супероле

Вибачте за -1, але мова йде про порівняння багатьох файлів між собою.
Манохар Редді Поредді

1

якщо ваш запуск декількох розбіжностей базується на одному файлі, ви, ймовірно, можете спробувати написати сценарій, який має цикл for, щоб пройти через кожну директорію та запустити розбіжність. Хоча це було б не поруч, ви могли б принаймні швидко порівняти їх. сподівання, що допомогло.


так, але якби я порівнював, наприклад, 3 файли, я хотів би, щоб усі вони порівнювались з кожним з інших 2 файлів, оскільки diff робить це переставлення, щоб побачити, де вони збігаються.
Javed Ahamed

Я знайшов цю команду, яка може допомогти з вашим скриптом, який називається 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

Похідне від @ charles-duffy : 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.