Bez ohľadu na to, v akom systéme sa musím pohrať s kódom, skôr či neskôr bude príliš drahé na porovnanie rôzne verzie zdrojov. Tu sú jednoduché bezplatné nástroje na nájdenie rozdielov v súboroch pre Linux, Windows a Mac. Všeobecný formát spustenia – súbor1 súbor2.

V systéme Windows sa úloha porovnávania obsahu súborov (a dokonca aj adresárov, čo niekedy nie je zbytočná) dobre vyrovná s WinMerge. Jednoduché. Nie je viazaný na žiadne IDE. Je napísaný v Qt a je multiplatformový – mal by bežať aj na nikoch. Okrem súborov dokáže porovnávať aj obsahy adresárov (aj na základe masiek regulárnych výrazov). Môžete pridať ďalšie doplnky.

WinMerge je multiplatformový nástroj na porovnávanie súborov a ďalšie

Mac - opendiff. Je to samostatný komponent XCode. Samostatný je možné spustiť z príkazového riadku. Zvýrazňuje rozdiely v bledosivej, no mimochodom vie šípkami ukázať, čo kde pribudlo. Môže vykonať zlúčenie (key -merge). Ak okrem porovnávaných súborov zadáte za kľúčom -predok aj súbor spoločného predka, porovnanie sa vykoná s ním. Môže porovnávať priečinky.

opendiff utility – bezplatný nástroj na porovnávanie súborov v systéme Mac

Linux – . Dostupné na všetkých platformách (Windows, Mac, Linux) vďaka tomu, že je napísané aj v Qt. Môže porovnávať až tri súbory alebo adresáre. Podporuje schopnosť zlúčiť zmeny s podporou úprav pre manuálne rozlíšenie konflikty.

Nástroj kdiff3 - porovnanie dvoch súborov

AKTUALIZÁCIA 18.10.2013

Ak pracujete v Gnom na nikoch, potom je meld skvelá voľba. Integrácia s populárnymi systémami na správu verzií (Git, Subversion atď.), zlučovacie nástroje – automatické spájanie, editácia so zachytením aktuálnych rozdielov za behu, zvýrazňovanie syntaxe. Existujú porty pre OS X Windows.

No, ako posledná možnosť (ak nemôžete nainštalovať nič tretej strany), nevzhľadný rozdiel príkazový riadok(predinštalované na systémoch podobných nixu vrátane počítačov Mac a Solaris). Flexibilné. S nastaveniami sa môžete hrať dlho a s nadšením, aby ste mohli zobraziť rozdiely na základe masky (-F), získať porovnanie v obvyklých dvoch stĺpcoch (kláves – vedľa seba) atď. Pre veľké neznáme súbory preferujem výstup v „kontextovom“ formáte, keď sa nezobrazia len zmenené riadky, ale aj tie, ktoré k nim priliehajú.

Na porovnanie viac ako dvoch súborov môže byť vhodný diff3.

Na porovnanie dvoch alebo viacerých súborov v systéme Linux existuje príkaz diff. Dokáže porovnávať jednotlivé súbory aj adresáre. Pozrime sa na syntax, možnosti príkazu diff a niektoré príklady použitia.

syntax príkazu diff

Príkaz diff má nasledujúcu syntax:

Diff [možnosti] súbory-alebo-adresáre

Špecifikujeme možnosti a poskytujeme dva alebo viac súborov alebo adresárov, ktoré potrebujeme porovnať.

možnosti príkazu diff

Pozrime sa na hlavné možnosti príkazu diff. Zvážim len tie možnosti, ktoré používam najčastejšie.

-EIgnorujte zmeny spôsobené pridaním znaku tabulátora do textu.
-bIgnorujte zmeny spôsobené pridaním medzier.
-wIgnorujte zmeny, ktoré zahŕňajú pridávanie medzier a tabulátorov.
-Bignorovať nové prázdne riadky.
-p (alebo --show-c-function)zobraziť názov funkcie jazyka C, v ktorej boli nájdené zmeny.
-y (alebo --side-by-side)zobraziť výsledky v dvoch stĺpcoch.
-rrekurzívne prehliadať adresáre.
-SÚBOR Xvylúčiť z vyhľadávania súbory, ktorých názvy sa zhodujú so vzormi v súbore FILE.
-d (alebo --minimálne)snažte sa nájsť čo najmenej zmien (to znamená vylúčiť falošne pozitívne).

Príklady použitia príkazu diff

Porovnanie dvoch textových súborov

Pre jednoduché porovnanie oboch textové súbory s názvami myfile1 a myfile2 vykonajte príkaz v termináli:

Rozdiel môj súbor1 môj súbor2

Je vhodné presmerovať výstup príkazu diff do súboru s príponou diff. Väčšina textových editorov pre Linux, ako napríklad Gedit, rozpoznáva tento súbor a zvýrazní jeho syntax. Ak chcete nasmerovať výsledok porovnania do súboru changes.diff, musíte použiť symbol presmerovania streamu (>):

Diff myfile1 myfile2 > changes.diff

Porovnanie adresárov obsahujúcich textové súbory

Pozrime sa na príklad porovnania dvoch adresárov (mydir1 a mydir2), ktoré obsahujú textové súbory. Hlavným rozdielom oproti vyššie uvedenému príkladu je, že pridáme voľbu -r, čo znamená, že bude rekurzívne prechádzať súbormi v adresároch.

Diff -r mydir1 mydir2 > changes.diff

Teraz predpokladajme, že adresáre, v ktorých porovnávame súbory, obsahujú množstvo „smetí“, ktoré by sme porovnávať nemali. Vytvorme si súbor excludeFiles a zapíšme si do neho vzory a názvy súborov, ktoré by sme nemali porovnávať. Obsah súboru includeFiles môže vyzerať napríklad takto:

*.o ChangeLog* *.bak *.exe

Teraz povedzme príkazu diff, aby použil náš súbor excludeFiles pri porovnávaní adresárov:

Rozdiel -r -X vylučovaťSúbory môj adresár1 môj adresár2 > zmeny.diff

Porovnávame teda súbory, ktorých názvy sa nezhodujú so vzormi v súbore excludeFiles, napríklad vasya.exe alebo ChangeLog12.

Pridajme niekoľko ďalších možností, ktoré sú popísané vyššie, aby sme zlepšili výsledok porovnania:

Rozdiel -rwBd -X vylúčitSúbory mydir1 mydir2 > changes.diff

Porovnávame súbory v adresároch mydir1 a mydir2, pričom ignorujeme zmeny spojené s pridávaním prázdne riadky, medzery, tabulátory a tiež použiť vzory názvov súborov v includeFiles na vylúčenie nepotrebných súborov z porovnávania.

Záver

Ďalšie informácie o používaní príkazu diff vo vašom Linuxový systém môžete ho získať spustením príkazu:

Muž dif

Existujú aj programy, ktoré umožňujú porovnávať súbory pomocou grafického rozhrania. Napríklad program Meld, ktorý vizuálne ukazuje, kde a čo sa v súboroch zmenilo.

), ich porovnania, ako aj porovnania klientov GUI pre nich. Diskutovalo sa aj o IDE pluginoch pre prácu s git a mercurial. Ale prakticky neboli žiadne informácie o vizuálnom porovnávaní a zlučovaní nástrojov riešenia konfliktov.

Nedávno som „preskočil“ z mercurialu (ktorý sa mi stále zdá pohodlnejší a logickejší) na git, pretože drvivá väčšina projektov, ktoré sú pre mňa zaujímavé, používa git a sú hosťované na github. V tejto súvislosti vyvstala otázka revízie arzenálu nástrojov, najmä otázka výber nástroja vizuálne porovnanie a zlúčenie (rozlíšiť a zlúčiť). Aby som doplnil nedostatok informácií o hube, rozhodol som sa napísať túto minirecenziu. Ako sa hovorí - v horúcom prenasledovaní.

Pod rezom nájdete aj príklady nastavení Git na použitie s DiffMerge a WinMerge pod Windows. Myslím, že to ušetrí veľa času.

Meno Zvláštnosti Platforma

KDiff3

Git a WinMerge

1) Pridať do adresára c:/Git/libexec/git-core/mergetools/
winmerge súbor s nasledujúcim obsahom:

Diff_cmd () ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 ) merge_cmd () ( "c:/Program Files (x86) )/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? )
Keď sa Gitu nepodarí automaticky zlúčiť zmeny, dôjde ku konfliktu zlúčenia a do konfliktného súboru sa pridajú značky zlúčenia (<<<<<<<, =======, и >>>>>>>). Sú potrebné na vyriešenie konfliktu pomocou nástrojov tretích strán.
Pozrime sa na súbor readme.txt ktorý vzniká v dôsledku spájania vetiev majster a nový vo vyššie uvedenom príklade:

<<<<<<< HEAD master str ======= new str >>>>>>> nové
Súbor konfliktu môžeme otvoriť pomocou programu WinMerge na vyriešenie konfliktu.

Tým sa otvorí nástroj obojsmerného zlúčenia:

Na základe opísanej logiky prepíšeme príkaz merge merge_cmd takto:
merge_cmd() ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$? )
V skutočnosti sú obe vyššie uvedené možnosti ekvivalentné.

2) Poďme upraviť .gitconfig
tool = winmerge cmd = "winmerge" tool = winmerge cmd = "winmerge" trustExitCode = false keepBackup = false
Posledný riadok ruší ukladanie záložných súborov do adresára úložiska.

3) Vytvorme konflikt pri zlučovaní dvoch vetiev (pozri príklad s použitím DiffMerge).
git difftool master new // porovnaj dve vetvy

Ak chcete vyriešiť konflikt pri zlučovaní vetiev, použite príkaz
git mergetool

Dnes som bol požiadaný, aby som porovnal nadpisy malých odsekov v dvoch veľkých textových súboroch. Všetky tituly začínali hviezdičkou, takže neboli žiadne problémy. Ale nie je to vôbec zaujímavé a skôr z nudy ako pre skutočné použitie som chcel nájsť spôsob, ako extrahovať nadpisy z akéhokoľvek textu. Bohužiaľ, 100% pracovná metóda sa nenašla, ale na konci článku bude zaujímavé riešenie, ako zmeniť dvojité alebo viac prázdnych riadkov na jeden prázdny.

Na začiatok je najjednoduchšia možnosť, keď potrebujete porovnať 2 textové súbory.
Existuje na to príkaz diff. Syntax je nasledovná:

diff first_file second_file

Oveľa pohodlnejšie je presmerovať výstup do súboru s príponou diff

rozdiel prvý_súbor druhý_súbor > zisk.rozdiel

Ak sa takýto súbor otvorí v textový editor, syntax sa zvýrazní a proces analýzy bude jednoduchší.

Program porovnáva reťazce a ak jeden zo súborov obsahuje riadok, ktorý nie je v druhom, potom „>“ alebo „

Ak chcete získať výstup riadkov, ktoré začínajú jedným znakom (v tomto prípade je to *), najlepším spôsobom je použiť príkaz grep. Napríklad, ak chcete poslať do súboru 1.txt všetky riadky, ktoré začínajú „*“ v súbore file.txt, potom by ste mali spustiť

grep "^*" "súbor.txt" > 1.txt

Čo sa týka extrakcie nadpisov z textu akéhokoľvek formátu, neprišlo z toho nič rozumné.
Ale nenechajte kód zmiznúť, nechajte ho ležať tu:

#!/bin/bash
n=1 dolár
st=`sed -n '/^$/p' $n| wc -l | awk ‘(tlač $1)’` #počítajte počet prázdnych riadkov
sed -nr ‘/^.(100)/!p’ $n > /tmp/copy2$n #má záujem len o riadky s menej ako 100 znakmi (hlavičky pravdepodobne nebudú dlhšie)
sed -n “1p” /tmp/copy2$n > ‘Hlavičky’$n # Vytiahneme prvý riadok (bude to hlavička)
#
tr 'n' '^' /tmp/copy$n # Zmeňte všetky spojovníky na znak ^
#
#Zmeňte poradie ^^^ (atď.) s dvojitými pomlčkami (výsledkom je prázdny riadok)
#A zmeňte jeden znak ^ na jeden spojovník (bez prázdneho riadku).
sed -i ‘s/^^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^/nn/g’ /tmp/copy$n
sed -i ‘s/^/n/g’ /tmp/copy$n
#
pričom [ $st -gt 0 ] #loop toľkokrát, koľkokrát je prázdnych výrazov.
robiť
st=$[$st-1]
sed -i ‘1,/^$/ d’ /tmp/copy$n #zmazať všetky riadky až po prvý prázdny riadok (vrátane seba)
sed -n “1p” /tmp/copy$n >> ‘Hlavičky ‘$n #pridajte zvyšný riadok do súboru
hotovo

Mimochodom, tento kód sa dobre vyrovnal s porovnaním súborov, ktoré mi boli odoslané, ale so skutočnými knihami boli problémy.

IN operačný systém Linux má niekoľko softvérové ​​riešenia na porovnanie vnútorného obsahu dvoch súborov pomocou rôznych metód. Samozrejme, takáto funkcia bude pre webového vývojára neuveriteľne užitočná na porovnanie dvoch textových súborov. Napríklad existujú 2 súbory css štýly, ktoré je potrebné rýchlo porovnať, aby ste v nich našli rozdiely. Alebo si pozrite, čo je nové v aktualizovanom PHP skripte.

Jasný príklad zo života:

Takže v mojom prípade potrebujem porovnať 2 súbory bootstrap.css. Toto leto som opravil niečo v štýloch súboru bootstrap.css (čo sa nedalo urobiť, pretože na úpravy vlastného štýlu je potrebné použiť samostatný style.css). Kvôli tejto maličkosti je pre mňa problematické upgradovať z verzie 3.3.2 na bootstrap 3.3.5, pretože... vo viac nová verzia môj aktualizovaný súbor CSS, po nahradení všetky moje úpravy zmiznú a časť dizajnu webovej stránky „odletí“. Vzhľadom na to, že súbor so štýlom bootstrap obsahuje viac ako 6 000 riadkov kódu, je absolútne nemožné zobraziť zmeny sami.

Porovnanie súborov s pomôckou diff v systéme Linux:

Ak chcete porovnať súbory `bootstrap.css" a `bootstrap-original.css" (pre prehľadnosť som premenoval pôvodný súbor a pridal som k nemu predponu -original), zadajte do terminálu: $ diff bootstrap.css bootstrap-original. css V konzole sme dostali štandardnú správu o rozdieloch v týchto súboroch. Ak chcete prehľad automaticky uložiť do samostatný súbor na disku - odošlite výstup výsledkov rozdielov do súboru $ diff bootstrap.css bootstrap-original.css > css-modifications.diff Teraz bude celá správa o rozdieloch súborov uložená v rovnakom priečinku pod názvom " сss-modifications.diff"Tento výstup však jasne neukazuje, kde a čo som pridal alebo odstránil. Ak chcete jasnejšie vidieť, ako sa tieto dva súbory líšia, môžete použiť sdiff; Rozdiel oproti tomuto balíku je v tom, že negeneruje prehľad rozdielov. Usporiadaním oboch súborov do dvoch stĺpcov okamžite zobrazí rozdiely v oboch súboroch. `|" označuje riadky, ktoré sa od seba líšia `" zvýrazní riadky, ktoré sa vyskytujú iba v druhom súbore.

Syntax príkazu je podobná príkazu diff:

$ sdiff bootstrap.css bootstrap-original.css Vypíšeme rozdiely do konzoly a príkazom: $ sdiff bootstrap.css bootstrap-original.css > сss-modifications.diff Celú správu zapíšeme do samostatného súboru. Tiež by som odporučil pridať argument -t pre čitateľnejší formát správy rozdielov (dosiahnutý zarovnaním vzdialeností medzi tabuľkami s medzerami). V opačnom prípade sa štandardná správa otvorí v gedit dobre, ale v Sublime sa „rozmaže“: $ sdiff bootstrap.css bootstrap-original.css > сss-modifications.diff -t P.S. Tým možnosti porovnávania súborov v Linuxe nekončia a dokonca môžete porovnávať 3 súbory súčasne. Ak to chcete urobiť, použite príkaz Na porovnanie troch súborov naraz použite diff3.