Как да сравните два текстови файла в терминала на Linux

Трябва да видите разликите между две ревизии на текстов файл? Тогава diff е командата, от която се нуждаете. Този урок ви показва как да използвате diff на Linux и macOS, по лесния начин.

Гмуркане в диф

Командата diff сравнява два файла и създава списък с разликите между двата. За да бъде по-точен, той създава списък с промените, които трябва да бъдат направени в първия файл, за да съвпадне с втория файл. Ако имате това предвид, ще ви е по-лесно да разберете изхода от diff. Командата diff е предназначена да намери разликите между файловете с изходен код и да произведе изход, който може да бъде прочетен и въздействан от други програми, като например кръпка команда. В този урок ще разгледаме най-полезните удобни за хората начини за използване на diff.

Нека се потопим направо и да анализираме два файла. Редът на файловете в командния ред определя кой файл diff счита за „първи файл“ и кой за „втори файл“. В примера по-долу alpha1 е първият файл, а alpha2 е вторият файл. И двата файла съдържат фонетична азбука но вторият файл, alpha2, е претърпял допълнително редактиране, така че двата файла да не са идентични.

Можем да сравним файловете с тази команда. Въведете diff, интервал, името на първия файл, интервал, името на втория файл и след това натиснете Enter.

diff alpha1 alpha2

Как да анализираме този изход? След като знаете какво да търсите, не е толкова лошо. Всяка разлика е изброена на свой ред в една колона и всяка разлика е обозначена. Етикетът съдържа цифри от двете страни на буквата, като 4c4. Първото число е номерът на реда в алфа1, а второто число е номерът на реда в алфа2. Буквата в средата може да бъде:

c: Редът в първия файл трябва да бъде променен, за да съответства на реда във втория файл.
d: Редът в първия файл трябва да бъде изтрит, за да съответства на втория файл.
a: Към първия файл трябва да се добави допълнително съдържание, за да съответства на втория файл.

4c4 в нашия пример ни казва, че четвъртият ред от alpha1 трябва да бъде променен, за да съответства на четвъртия ред от alpha2. Това е първата разлика между двата файла, които diff откри.

Редовете, които започват с, се отнасят до втория файл, alpha2. Редът Dave ни казва, че думата Dave е съдържанието на четвъртия ред в алфа2. За да обобщим тогава, трябва да заменим Delta с Dave на четвъртия ред в alpha1, за да съвпадне този ред и в двата файла.

  Как да играете игри на Nintendo DS на Linux с MelonDS

Следващата промяна е обозначена с 12c12. Прилагайки същата логика, това ни казва, че ред 12 в alpha1 съдържа думата Lima, но ред 12 от alpha2 съдържа думата Linux.

Третата промяна се отнася до ред, който е бил изтрит от алфа2. Етикетът 21d20 се дешифрира като „ред 21 трябва да бъде изтрит от първия файл, за да накарат двата файла да се синхронизират от ред 20 нататък“. В

Четвъртата разлика е обозначена с 26a26,28. Тази промяна се отнася до три допълнителни реда, които са добавени към алфа2. Обърнете внимание на 26,28 на етикета. Двуредовите числа, разделени със запетая, представляват диапазон от номера на редове. В този пример диапазонът е от ред 26 до ред 28. Етикетът се интерпретира като „на ред 26 в първия файл, добавете редове 26 до 28 от втория файл.“ Показани са ни трите реда в алфа2, които трябва да бъдат добавени към алфа1. Те съдържат думите Quirk, Strange и Charm.

Snappy One-Lines

Ако всичко, което искате да знаете, е дали два файла са еднакви, използвайте опцията -s (докладване за идентични файлове).

diff -s alpha1 alpha3

Можете да използвате опцията -q (кратко), за да получите еднакво кратко изявление за това, че два файла са различни.

diff -q alpha1 alpha2

Едно нещо, за което трябва да внимавате, е, че с два идентични файла опцията-q (кратко) напълно се блокира и изобщо не отчита нищо.

Алтернативен изглед

Опцията -y (едно до друго) използва различно оформление, за да опише разликите във файловете. Често е удобно да използвате опцията -W (ширина) със страничен изглед, за да ограничите броя на колоните, които се показват. По този начин се избягват грозни заобикалящи се линии, които затрудняват четенето на изхода. Тук сме казали на diff да произвежда страничен дисплей и да ограничи изхода до 70 колони.

diff -y -W 70 alpha1 alpha2

Първият файл на командния ред, alpha1, е показан отляво, а вторият ред на командния ред, alpha2, е показан отдясно. Редовете от всеки файл се показват един до друг. Има индикаторни знаци до онези редове в алфа2, които са били променени, изтрити или добавени.

|: Ред, който е променен във втория файл.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Ред, който е добавен към втория файл, който не е в първия файл.

Ако предпочитате по-компактно едно до друго обобщение на разликите във файловете, използвайте опцията –suppress-common-lines. Това принуждава diff да изброява само променените, добавени или изтрити редове.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Добавете цвят

Друга помощна програма, наречена colordiff, добавя цветно подчертаване към изхода на diff. Това прави много по-лесно да се види кои линии имат разлики.

  Как автоматично да преименувате медийни файлове на Linux с FileBot

Използвайте apt-get, за да инсталирате този пакет във вашата система, ако използвате Ubuntu или друга базирана на Debian дистрибуция. В други дистрибуции на Linux използвайте вместо това инструмента за управление на пакети на вашата Linux дистрибуция.

sudo apt-get install colordiff

Използвайте colordiff точно както бихте използвали diff.

Всъщност colordiff е обвивка за diff и diff върши цялата работа зад кулисите. Поради това всички опции за разлика ще работят с colordiff.

Предоставяне на някакъв контекст

За да намерим средно положение между това, че всички редове във файловете се показват на екрана и само променените редове, изброени, можем да помолим diff да предостави някакъв контекст. Има два начина да направите това. И двата начина постигат една и съща цел, която е да се покажат някои линии преди и след всеки променен ред. Ще можете да видите какво се случва във файла на мястото, където е открита разликата.

Първият метод използва опцията -c (копиран контекст).

colordiff -c alpha1 alpha2

Изходът diff има заглавка. Заглавката изброява имената на двата файла и времената за тяхната промяна. Има звездички

пред името на първия файл и тирета (-) преди името на втория файл. Ще се използват звездички и тирета, за да се посочи към кой файл принадлежат редовете в изхода.

Ред от звездички с 1,7 в средата показва, че гледаме линии от алфа1. За да бъдем точни, разглеждаме редове от един до седем. Думата Delta е маркирана като променена. До него има удивителен знак (!) и е червен. Има три реда непроменен текст, показан преди и след този ред, така че можем да видим контекста на този ред във файла.

Линията с тирета с 1,7 в средата ни казва, че сега гледаме линии от alpha2. Отново разглеждаме редове от един до седем, като думата Dave на четвъртия ред е маркирана като различна.

colordiff -C 2 alpha1 alpha2

Три реда контекст над и под всяка промяна е стойността по подразбиране. Можете да посочите колко реда контекст искате да предостави diff. За да направите това, използвайте опцията -C (копиран контекст) с главно „C“ и посочете броя на редовете, който искате:

colordiff -u alpha1 alpha2

Втората опция diff, която предлага контекст, е опцията -u (унифициран контекст).

Както и преди, имаме заглавие на изхода. Двата файла са наименувани и са показани времената за промяна. Има тирета (-) преди името на алфа1 и знаци плюс (+) преди името на алфа2. Това ни казва, че тирета ще се използват за обозначаване на алфа1, а знаците плюс ще се използват за обозначаване на алфа2. Из целия списък са разпръснати редове, които започват със знаци (@). Тези линии отбелязват началото на всяка разлика. Те също така ни казват кои редове се показват от всеки файл.

  5 отлични мениджъри за изтегляне за Linux

Показани са ни трите реда преди и след реда, обозначени като различни, за да можем да видим контекста на променения ред. В унифицирания изглед линиите с разликата са показани една над друга. Редът от алфа1 се предхожда от тире, а реда от алфа2 се предхожда от знак плюс. Този дисплей постига в осем реда това, което копираният контекстен дисплей по-горе е трябвало да направи петнадесет.

colordiff -U 2 alpha1 alpha2

Както бихте очаквали, можем да поискаме от diff да предостави точно броя на редовете с унифициран контекст, който бихме искали да видим. За да направите това, използвайте опцията -U (унифициран контекст) с главно „U“ и посочете броя на редовете, който искате:

Игнориране на бялото пространство и главния букв

colordiff -y -W 70 test4 test5

Нека анализираме още два файла, test4 и test5. В тях има имената шестима супергерои.

Резултатите показват, че diff не открива нищо различно с линиите Черна вдовица, Спайдърмен и Тор. Той отбелязва промените с линиите на Капитан Америка, Ironman и The Hulk.

И така, какво е различното? Е, в test5 Хълк се изписва с малка буква „h“, а Капитан Америка има допълнително пространство между „Капитан“ и „Америка“. Добре, това е ясно, но какво не е наред с линията на Ironman? Няма видими разлики. Ето едно добро правило. Ако не можете да го видите, отговорът е бяло пространство. В края на този ред почти сигурно има един-два случайни интервали или табулаторен знак.

Ако те нямат значение за вас, можете да инструктирате diff да игнорира конкретни видове разлика в редовете, включително:
-i: Игнорирайте разликите в случай.
-Z: Игнорирайте крайното бяло пространство.
-b: Игнорирайте промените в количеството празно пространство.

-w: Игнорирайте всички промени в бялото пространство.

colordiff -i -y -W 70 test4 test5

Нека помолим diff да провери отново тези два файла, но този път да игнорира разликите в случай.

colordiff -i -Z -y -W 70 test4 test5

Редовете с „The Hulk“ и „The Hulk“ вече се считат за съвпадение и няма разлика с флаг с малки букви „h“. Нека помолим diff също да игнорира крайното бяло пространство.

colordiff -i -w -y -W 70 test4 test5

Както се подозира, крайното бяло пространство трябва да е било разликата в линията на Ironman, защото diff вече не маркира разлика за тази линия. Това оставя Капитан Америка. Нека помолим diff да игнорира малки и малки букви и да игнорира всички проблеми с бялото пространство.

Като казва на diff да игнорира разликите, за които не сме загрижени, diff ни казва, че за нашите цели файловете съвпадат. Командата diff има много повече опции, но повечето от тях се отнасят до генериране на машинно четим изход. Те могат да бъдат прегледани на Linuxman страница

. Опциите, които сме използвали в примерите по-горе, ще ви позволят да проследите всички разлики между версиите на вашите текстови файлове, като използвате командния ред и човешките очи.