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.
Tartalomjegyzék
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.
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.
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.
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.