Утиліта 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.