Cum se compară două fișiere text în terminalul Linux

Trebuie să vedeți diferențele dintre două versiuni ale unui fișier text? Atunci diff este comanda de care aveți nevoie. Acest tutorial vă arată cum să utilizați diff pe Linux și macOS, în mod simplu.

Scufundare în dif

Comanda diff compară două fișiere și produce o listă a diferențelor dintre cele două. Pentru a fi mai precis, produce o listă a modificărilor care ar trebui făcute la primul fișier, pentru a-l face să se potrivească cu al doilea fișier. Dacă țineți cont de acest lucru, veți găsi mai ușor să înțelegeți rezultatul de la diff. Comanda diff a fost concepută pentru a găsi diferențe între fișierele de cod sursă și pentru a produce o ieșire care ar putea fi citită și acționată de către alte programe, cum ar fi plasture comanda. În acest tutorial, vom analiza cele mai utile modalități prietenoase pentru oameni de a folosi diff.

Să intrăm direct și să analizăm două fișiere. Ordinea fișierelor pe linia de comandă determină ce fișier diff consideră a fi „primul fișier” și pe care îl consideră a fi „al doilea fișier”. În exemplul de mai jos, alpha1 este primul fișier, iar alpha2 este al doilea fișier. Ambele fișiere conțin alfabet fonetic dar cel de-al doilea fișier, alpha2, a fost editat în continuare, astfel încât cele două fișiere să nu fie identice.

Putem compara fișierele cu această comandă. Tastați diff, un spațiu, numele primului fișier, un spațiu, numele celui de-al doilea fișier, apoi apăsați Enter.

diff alpha1 alpha2

Cum disecăm acea ieșire? Odată ce știi ce să cauți, nu e chiar așa de rău. Fiecare diferență este listată pe rând într-o singură coloană și fiecare diferență este etichetată. Eticheta conține numere de fiecare parte a unei litere, cum ar fi 4c4. Primul număr este numărul liniei în alpha1, iar al doilea număr este numărul liniei în alpha2. Litera din mijloc poate fi:

c: Linia din primul fișier trebuie schimbată pentru a se potrivi cu linia din al doilea fișier.
d: Linia din primul fișier trebuie ștearsă pentru a se potrivi cu al doilea fișier.
a: Trebuie adăugat conținut suplimentar la primul fișier pentru ca acesta să se potrivească cu al doilea fișier.

4c4 din exemplul nostru ne spune că linia patru din alpha1 trebuie schimbată pentru a se potrivi cu linia patru din alpha2. Aceasta este prima diferență între cele două fișiere care au fost găsite.

Liniile care încep cu se referă la al doilea fișier, alpha2. Linia Dave ne spune că cuvântul Dave este conținutul liniei patru din alpha2. Pentru a rezuma, atunci trebuie să înlocuim Delta cu Dave pe linia patru în alpha1, pentru a face ca linia să se potrivească în ambele fișiere.

  Cum să îmbunătățiți clipboard-ul Linux cu CopyQ

Următoarea modificare este indicată de 12c12. Aplicând aceeași logică, aceasta ne spune că linia 12 din alpha1 conține cuvântul Lima, dar linia 12 din alpha2 conține cuvântul Linux.

A treia modificare se referă la o linie care a fost ștearsă din alpha2. Eticheta 21d20 este descifrată ca „linia 21 trebuie ștearsă din primul fișier pentru ca ambele fișiere să se sincronizeze de la linia 20 încolo.” The

A patra diferență este etichetată 26a26,28. Această modificare se referă la trei linii suplimentare care au fost adăugate la alpha2. Observați 26,28 din etichetă. Numerele pe două linii separate prin virgulă reprezintă o serie de numere de rând. În acest exemplu, intervalul este de la rândul 26 la rândul 28. Eticheta este interpretată ca „la linia 26 din primul fișier, adăugați liniile 26 la 28 din al doilea fișier”. Ni se arată cele trei linii din alpha2 care trebuie adăugate la alpha1. Acestea conțin cuvintele Quirk, Strange și Charm.

Snappy One-Liners

Dacă tot ceea ce vrei să știi este dacă două fișiere sunt la fel, folosește opțiunea -s (raportează fișiere identice).

diff -s alpha1 alpha3

Puteți folosi opțiunea -q (scurtă) pentru a obține o declarație la fel de concisă despre două fișiere diferite.

diff -q alpha1 alpha2

Un lucru de care trebuie să fii atent este că, cu două fișiere identice, opțiunea-q (scurtă) se blochează complet și nu raportează absolut nimic.

O viziune alternativă

Opțiunea -y (ună lângă alta) folosește un aspect diferit pentru a descrie diferențele dintre fișiere. Este adesea convenabil să utilizați opțiunea -W (lățime) cu vizualizarea una lângă alta, pentru a limita numărul de coloane care sunt afișate. Acest lucru evită liniile urâte care fac rezultatul dificil de citit. Aici i-am spus diffului să producă un afișaj alăturat și să limiteze rezultatul la 70 de coloane.

diff -y -W 70 alpha1 alpha2

Primul fișier de pe linia de comandă, alpha1, este afișat în stânga, iar a doua linie de pe linia de comandă, alpha2, este afișat în dreapta. Liniile din fiecare fișier sunt afișate, una lângă alta. Există caractere indicatoare lângă acele linii în alpha2 care au fost modificate, șterse sau adăugate.

|: O linie care a fost modificată în al doilea fișier.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: O linie care a fost adăugată la al doilea fișier care nu se află în primul fișier.

Dacă preferați un rezumat alăturat mai compact al diferențelor de fișiere, utilizați opțiunea –suppress-common-lines. Acest lucru forțează diff să listeze numai liniile modificate, adăugate sau șterse.

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

Adăugați o pată de culoare

Un alt utilitar numit colordiff adaugă evidențierea culorii la ieșirea dif. Acest lucru face mult mai ușor să vedeți ce linii au diferențe.

  Cum să împerechezi și să folosești dispozitive Bluetooth pe Linux

Utilizați apt-get pentru a instala acest pachet pe sistemul dvs. dacă utilizați Ubuntu sau o altă distribuție bazată pe Debian. Pe alte distribuții Linux, utilizați instrumentul de gestionare a pachetelor din distribuția dvs. Linux.

sudo apt-get install colordiff

Folosiți colordiff așa cum ați folosi diff.

De fapt, colordiff este un înveliș pentru diff, iar diff face toată munca din culise. Din acest motiv, toate opțiunile de diferență vor funcționa cu colordiff.

Oferirea unui anumit context

Pentru a găsi o cale de mijloc între a avea toate liniile din fișierele afișate pe ecran și a avea doar liniile modificate listate, putem cere diffului să furnizeze un anumit context. Există două moduri de a face acest lucru. Ambele moduri realizează același scop, care este de a afișa unele linii înainte și după fiecare linie schimbată. Veți putea vedea ce se întâmplă în fișier în locul în care a fost detectată diferența.

Prima metodă folosește opțiunea -c (context copiat).

colordiff -c alpha1 alpha2

Ieșirea diff are un antet. Antetul listează cele două nume de fișiere și orele de modificare a acestora. Sunt asteriscuri

înaintea numelui primului fișier și liniuțe (-) înaintea numelui celui de-al doilea fișier. Asteriscurile și liniuțele vor fi folosite pentru a indica fișierul căruia îi aparțin liniile din rezultat.

O linie de asteriscuri cu 1,7 în mijloc indică că ne uităm la liniile din alpha1. Pentru a fi precis, ne uităm la rândurile unu până la șapte. Cuvântul Delta este marcat ca modificat. Are un semn de exclamare ( ! ) lângă el și este roșu. Există trei linii de text neschimbat afișate înainte și după acea linie, astfel încât să putem vedea contextul acelei linii în fișier.

Linia de linii cu 1,7 în mijloc ne arată că acum ne uităm la liniile din alpha2. Din nou, ne uităm la rândurile unu până la șapte, cu cuvântul Dave de pe rândul patru marcat ca fiind diferit.

colordiff -C 2 alpha1 alpha2

Trei linii de context deasupra și sub fiecare modificare este valoarea implicită. Puteți specifica câte linii de context doriți să furnizeze diff. Pentru a face acest lucru, utilizați opțiunea -C (context copiat) cu un „C” majuscul și furnizați numărul de linii pe care doriți:

colordiff -u alpha1 alpha2

A doua opțiune de diferență care oferă context este opțiunea -u (context unificat).

Ca și înainte, avem un antet pe ieșire. Cele două fișiere sunt denumite, iar orele de modificare sunt afișate. Există liniuțe (-) înaintea numelui alpha1 și semnele plus (+) înaintea numelui alpha2. Acest lucru ne spune că liniuțele vor fi folosite pentru a se referi la alfa1 și semnele plus vor fi folosite pentru a se referi la alfa2. În întreaga listă sunt împrăștiate linii care încep cu la semnele (@). Aceste linii marchează începutul fiecărei diferențe. De asemenea, ne spun ce linii sunt afișate din fiecare fișier.

  Cum să recuperați datele pierdute pe Linux

Ni se arată cele trei linii înainte și după linia marcată ca fiind diferită, astfel încât să putem vedea contextul liniei modificate. În vizualizarea unificată, liniile cu diferența sunt afișate una deasupra celeilalte. Linia de la alpha1 este precedată de o liniuță, iar linia de la alpha2 este precedată de un semn plus. Această afișare realizează în opt rânduri ceea ce a fost nevoie de cincisprezece pentru afișarea contextului copiat de mai sus.

colordiff -U 2 alpha1 alpha2

După cum v-ați aștepta, putem cere diffului să furnizeze exact numărul de linii de context unificat pe care am dori să le vedem. Pentru a face acest lucru, utilizați opțiunea -U (context unificat) cu un „U” majuscul și furnizați numărul de linii pe care le doriți:

Ignorând spațiul alb și majusculele

colordiff -y -W 70 test4 test5

Să analizăm încă două fișiere, test4 și test5. Acestea au în ele numele șase de supereroi.

Rezultatele arată că diff nu găsește nimic diferit cu liniile Black Widow, Spider-Man și Thor. Se semnalează schimbările cu liniile Captain America, Ironman și The Hulk.

Deci, ce este diferit? Ei bine, în testul 5 Hulk este scris cu „h” minuscul, iar Căpitanul America are un spațiu suplimentar între „căpitan” și „America”. OK, se vede clar, dar ce e în neregulă cu linia Ironman? Nu există diferențe vizibile. Iată o regulă bună. Dacă nu îl puteți vedea, răspunsul este spațiul alb. Există aproape sigur un spațiu rătăcit sau două sau un caracter tabulator la sfârșitul acelei rânduri.

Dacă nu contează pentru dvs., puteți indica diff să ignore anumite tipuri de diferențe de linie, inclusiv:
-i: Ignorați diferențele de caz.
-Z: Ignorați spațiul alb final.
-b: Ignorați modificările cantității de spațiu alb.

-w: Ignorați toate modificările spațiilor albe.

colordiff -i -y -W 70 test4 test5

Să-i cerem lui diff să verifice din nou acele două fișiere, dar de data aceasta să ignore orice diferență în caz că.

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

Liniile cu „Hulk” și „Hulk” sunt acum considerate o potrivire și nicio diferență nu este semnalată pentru „h” minuscul. Să cerem diffului să ignore, de asemenea, spațiul alb final.

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

După cum se bănuiește, spațiul alb în urmă trebuie să fi fost diferența pe linia Ironman, deoarece diff nu mai semnalează o diferență pentru acea linie. Asta îl lasă pe Căpitanul America. Să-i cerem lui diff să ignore majuscule și minuscule și să ignore toate problemele legate de spațiul alb.

Spându-i lui diff să ignore diferențele pentru care nu ne preocupă, diff ne spune că, pentru scopurile noastre, fișierele se potrivesc. Comanda diff are mult mai multe opțiuni, dar majoritatea se referă la producerea de rezultate care pot fi citite de mașină. Acestea pot fi revizuite pe Linuxpagina de manual

. Opțiunile pe care le-am folosit în exemplele de mai sus vă vor permite să urmăriți toate diferențele dintre versiunile fișierelor dvs. text, folosind linia de comandă și globii oculari umani.