Hogyan hasonlítsunk össze két szövegfájlt a Linux terminálban

Látnia kell a különbségeket egy szövegfájl két változata között? Ekkor a diff a szükséges parancs. Ez az oktatóanyag bemutatja, hogyan használhatja a diff-et Linuxon és macOS-en az egyszerű módon.

Diff

A diff parancs összehasonlít két fájlt, és listát készít a kettő közötti különbségekről. A pontosság kedvéért létrehoz egy listát azokról a módosításokról, amelyeket az első fájlon végre kell hajtani, hogy az megfeleljen a második fájlnak. Ha ezt szem előtt tartja, könnyebben megértheti a diff kimenetét. A diff parancsot arra tervezték, hogy megtalálja a különbségeket a forráskód fájlok között, és olyan kimenetet állítson elő, amelyet más programok, például a tapasz parancs. Ebben az oktatóanyagban a diff használatának leghasznosabb emberbarát módjait fogjuk megvizsgálni.

Merüljünk el, és elemezzünk két fájlt. A parancssorban lévő fájlok sorrendje határozza meg, hogy melyik fájldiff tekinti az „első fájlnak”, és melyiket a „második fájlnak”. Az alábbi példában az alfa1 az első, az alfa2 pedig a második fájl. Mindkét fájl tartalmazza a fonetikus ábécé de a második fájl, az alpha2, további szerkesztésen esett át, így a két fájl nem azonos.

Ezzel a paranccsal összehasonlíthatjuk a fájlokat. Írja be a diff, egy szóközt, az első fájl nevét, egy szóközt, a második fájl nevét, majd nyomja meg az Enter billentyűt.

diff alpha1 alpha2

Hogyan boncolgassuk ezt a kimenetet? Ha már tudod, mit kell keresned, az nem olyan rossz. Minden eltérés egy oszlopban van felsorolva, és minden eltérés meg van jelölve. A címke a betű mindkét oldalán számokat tartalmaz, például 4c4. Az első szám a sor száma alfa1-ben, a második szám pedig a sorszám alfa2-ben. A középen lévő betű lehet:

c: Az első fájl sorát meg kell változtatni, hogy megfeleljen a második fájl sorának.
d: Az első fájl sorát törölni kell, hogy megfeleljen a második fájlnak.
a: Extra tartalmat kell hozzáadni az első fájlhoz, hogy megfeleljen a második fájlnak.

Példánkban a 4c4 azt mondja, hogy az alfa1 negyedik sorát meg kell változtatni, hogy megfeleljen az alfa2 negyedik sorának. Ez az első különbség a két fájl között, amelyek különbséget találtak.

A betűvel kezdődő sorok a második, alpha2 fájlra utalnak. A Dave sor azt mondja, hogy a Dave szó az alfa2 negyedik sorának tartalma. Összefoglalva, le kell cserélnünk a Delta-t Dave-re az alfa1 negyedik sorában, hogy ez a sor mindkét fájlban megegyezzen.

  Zene feltöltése a Google Zenékbe Linux rendszeren

A következő változást a 12c12 jelzi. Ugyanezt a logikát alkalmazva ez azt mondja nekünk, hogy az alfa1 12. sora tartalmazza a Lima szót, de az alpha2 12. sora a Linux szót.

A harmadik változás egy sorra vonatkozik, amelyet az alfa2-ből töröltek. A 21d20 címkét a rendszer a következőképpen fejti meg: „a 21. sort törölni kell az első fájlból, hogy mindkét fájl szinkronizálódjon a 20. sortól kezdődően.” A

A negyedik különbséget 26a26,28 címkével látták el. Ez a változás három extra sorra vonatkozik, amelyek hozzáadásra kerültek az alfa2-höz. Vegye figyelembe a 26,28-at a címkén. A vesszővel elválasztott kétsoros számok sorszám-tartományt jelölnek. Ebben a példában a tartomány a 26. sortól a 28. sorig terjed. A címke a következőképpen értelmezhető: „az első fájl 26. sorában adja hozzá a 26. és 28. sorokat a második fájlból”. Megjelenik az alpha2 három sora, amelyet hozzá kell adni az alfa1-hez. Ezek a Quirk, Strange és Charm szavakat tartalmazzák.

Snappy One-Bélés

Ha csak azt szeretné tudni, hogy két fájl azonos-e, használja az -s (azonos fájlok jelentése) opciót.

diff -s alpha1 alpha3

Használhatja a -q (brief) kapcsolót, hogy ugyanolyan tömör kijelentést kapjon két különböző fájlról.

diff -q alpha1 alpha2

Egy dologra figyelni kell, hogy két azonos fájl esetén a -q (brief) opció teljesen leáll, és egyáltalán nem jelent semmit.

Alternatív nézet

Az -y (egymás mellett) opció más elrendezést használ a fájlkülönbségek leírására. Gyakran kényelmes a -W (szélesség) opció használata oldalnézetben, hogy korlátozza a megjelenített oszlopok számát. Ezzel elkerülhetők a csúnya körbefutó sorok, amelyek megnehezítik a kimenet olvasását. Itt azt mondtuk a diff-nek, hogy készítsen egymás melletti kijelzőt, és korlátozza a kimenetet 70 oszlopra.

diff -y -W 70 alpha1 alpha2

A parancssor első fájlja, az alpha1, a bal oldalon, a parancssor második sora, az alpha2 pedig a jobb oldalon látható. Az egyes fájlok sorai egymás mellett jelennek meg. Az alfa2-ben módosított, törölt vagy hozzáadott sorok mellett jelzőkarakterek találhatók.

|: Egy sor, amely a második fájlban megváltozott.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: A második fájlhoz hozzáadott sor, amely nem szerepel az első fájlban.

Ha egy kompaktabb egymás melletti összefoglalást szeretne a fájlkülönbségekről, használja a –suppress-common-lines opciót. Ez arra kényszeríti a diff-et, hogy csak a módosított, hozzáadott vagy törölt sorokat listázza ki.

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

Adjon hozzá egy színfoltot

Egy másik, colordiff nevű segédprogram színkiemelést ad a diff kimenethez. Így sokkal könnyebben látható, hogy mely sorok különböznek egymástól.

  A képernyő rögzítése a Linux parancssorból

Az apt-get segítségével telepítse ezt a csomagot a rendszerére, ha Ubuntut vagy más Debian-alapú disztribúciót használ. Más Linux disztribúciók esetén használja inkább a Linux disztribúció csomagkezelő eszközét.

sudo apt-get install colordiff

Használja a colordiff-et ugyanúgy, mint a diff-et.

Valójában a colordiff a diff burkolója, és a diff elvégzi az összes munkát a színfalak mögött. Emiatt az összes diff opció működni fog a colordiff-fel.

Némi kontextus biztosítása

Aközött, hogy a fájlok összes sora megjelenik a képernyőn, és csak a megváltozott sorok jelenjenek meg, megkérhetjük a diff-et, hogy adjon meg valami kontextust, hogy megtaláljuk a középutat. Ennek két módja van. Mindkét módszer ugyanazt a célt éri el, vagyis néhány sor megjelenítése minden megváltoztatott sor előtt és után. Láthatja, mi történik a fájlban azon a helyen, ahol a különbséget észlelték.

Az első módszer a -c (másolt környezet) kapcsolót használja.

colordiff -c alpha1 alpha2

A diff kimenetnek van fejléce. A fejléc felsorolja a két fájlnevet és azok módosítási idejét. Vannak csillagok

az első fájl neve előtt és kötőjel (-) a második fájl neve előtt. A csillagok és a kötőjelek jelzik, hogy a kimenetben lévő sorok melyik fájlhoz tartoznak.

A csillagok sora 1,7-tel a közepén azt jelzi, hogy az alfa1 sorait nézzük. Hogy pontosak legyünk, az 1-7. sort nézzük. A Delta szó megváltozottként van megjelölve. Egy felkiáltójel ( ! ) van mellette, és piros. A sor előtt és után három sor változatlan szöveg jelenik meg, így láthatjuk a sor környezetét a fájlban.

A kötőjelek sora 1,7-tel a közepén azt jelzi, hogy most az alfa2 sorait nézzük. Ismét az 1-től a hetedik sorokat nézzük, a negyedik sorban a Dave szót másként jelölve.

colordiff -C 2 alpha1 alpha2

Minden változás felett és alatt három kontextussor az alapértelmezett érték. Megadhatja, hogy a diff hány kontextussort biztosítson. Ehhez használja a -C (másolt környezet) opciót nagy „C” betűvel, és adja meg a kívánt sorok számát:

colordiff -u alpha1 alpha2

A második kontextust kínáló diff opció az -u (egységesített környezet) opció.

Mint korábban, most is van egy fejléc a kimeneten. A két fájl el van nevezve, és a módosítási idők láthatók. Az alfa1 neve előtt kötőjel (-), az alfa2 neve előtt pedig pluszjel (+) található. Ez azt jelzi, hogy a kötőjelek az alfa1-re, a pluszjelek pedig az alfa2-re vonatkoznak. A listában elszórtan találhatók a (@) jellel kezdődő sorok. Ezek a vonalak jelzik az egyes különbségek kezdetét. Azt is megmondják, hogy az egyes fájlokból mely sorok jelennek meg.

Megjelenik az eltérőként megjelölt sor előtti és utáni három sor, így láthatjuk a megváltozott sor kontextusát. Az egyesített nézetben a különbséget mutató vonalak egymás felett jelennek meg. Az alfa1-ből származó sort egy kötőjel, az alfa2-ből származó sort pedig egy pluszjel előzi meg. Ez a kijelző nyolc sorban éri el azt, amit a fenti másolt kontextusos kijelzőnek tizenöt kellett.

colordiff -U 2 alpha1 alpha2

Ahogy az elvárható, megkérhetjük a diff-et, hogy adja meg pontosan az egyesített kontextus sorainak számát, amennyit látni szeretnénk. Ehhez használja az -U (egységesített környezet) opciót nagy „U” betűvel, és adja meg a kívánt sorok számát:

A szóköz és a kis- és nagybetűk figyelmen kívül hagyása

colordiff -y -W 70 test4 test5

Elemezzünk még két fájlt, a test4-et és a test5-öt. Ezekben a hat szuperhős neve szerepel.

  Hogyan nézhet Netflixet Linux asztalon az Electronplayer segítségével

Az eredmények azt mutatják, hogy a diff semmiben sem különbözik a Black Widow, Spider-Man és Thor vonalaktól. Megjelöli a változásokat az Amerika Kapitány, az Ironman és a The Hulk vonalakkal.

Szóval mi a különbség? Nos, az 5-ös tesztben Hulk kis „h” betűvel van írva, és Amerika Kapitánynak extra szóköz van a „Captain” és az „Amerika” között. OK, ez jól látható, de mi a baj az Ironman vonallal? Nincsenek látható különbségek. Íme egy jó ökölszabály. Ha nem látja, a válasz szóköz. Szinte biztosan van egy-két szóköz vagy egy tabulátor karakter a sor végén.

Ha ezek nem számítanak Önnek, utasíthatja a diff-et, hogy figyelmen kívül hagyja a sorkülönbségek bizonyos típusait, például:
-i: Figyelmen kívül hagyja a kis- és nagybetűs különbségeket.
-Z: Figyelmen kívül hagyja a záró szóközt.
-b: figyelmen kívül hagyja a szóközök mennyiségének változásait.

-w: figyelmen kívül hagyja az összes szóközi változást.

colordiff -i -y -W 70 test4 test5

Kérjük meg a diff-et, hogy ellenőrizze újra ezt a két fájlt, de ezúttal figyelmen kívül hagyjuk az esetleges eltéréseket.

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

A „The Hulk” és a „The hulk” sorok most egyezésnek számítanak, és nincs különbség kis „h” betűvel. Kérjük meg a diff-et, hogy hagyja figyelmen kívül a záró szóközt is.

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

Amint gyanítottuk, az Ironman vonalon a záró szóköz lehetett a különbség, mert a diff már nem jelzi a különbséget ezen a vonalon. Így marad Amerika Kapitány. Kérjük meg a diff-et, hogy hagyja figyelmen kívül a kis- és nagybetűket, és hagyjon figyelmen kívül minden szóközi problémát.

Ha azt mondja a diff-nek, hogy hagyja figyelmen kívül azokat a különbségeket, amelyek miatt nem aggódunk, a diff azt jelzi, hogy a mi célunk szerint a fájlok egyeznek. A diff parancsnak sokkal több opciója van, de ezek többsége géppel olvasható kimenet előállítására vonatkozik. Ezek áttekinthetők Linuxonman oldal

. A fenti példákban használt opciók segítségével a parancssor és az emberi szemgolyó segítségével nyomon követheti a szöveges fájlok verziói közötti összes különbséget.