Failide võrdlemine Linuxis. Ülevaade tööriistadest visuaalseks võrdlemiseks ja liitmiskonfliktide lahendamiseks Failide võrdlemine suuruse järgi linux

), nende võrdlusi, samuti nende GUI klientide võrdlusi. Arutati ka IDE pluginate üle, mis on mõeldud giti ja mercurialiga töötamiseks. Aga praktiliselt infot polnud visuaalse võrdluse ja konfliktide lahendamise tööriistade liitmise kohta.

Hiljuti “hüppasin” mercurilist (mida pean siiani mugavamaks ja loogilisemaks) gitile, sest valdav enamus minu jaoks huvitavatest projektidest kasutab git ja on githubis hostitud. Sellega seoses tekkis küsimus tööriistade arsenali läbivaatamise kohta, eriti küsimus tööriista valik visuaalne võrdlemine ja liitmine (diff ja merge). Jaoturi teabepuuduse täitmiseks otsustasin kirjutada selle miniarvustuse. Nagu öeldakse – tagaajamisel.

Lõike alt leiate ka näiteid Giti sätetest, mida saab kasutada koos DiffMerge'i ja WinMerge'iga Windowsi all. Ma arvan, et see säästab palju aega.

Nimi Iseärasused Platvorm

KDiff3

Git ja WinMerge

1) Lisage kataloogi c:/Git/libexec/git-core/mergetools/
winmerge fail järgmise sisuga:

Diff_cmd () ( "c:/Programmifailid (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 ) merge_cmd () ( "c:/Programmifailid (x86" )/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? )
Kui Gitil ei õnnestu muudatusi automaatselt liita, tekib liitmiskonflikt ja konfliktsele failile lisatakse liitmismarkerid (<<<<<<<, =======, и >>>>>>>). Need on vajalikud konflikti lahendamiseks kolmandate osapoolte tööriistade abil.
Vaatame faili readme.txt mis tekib harude liitmise tulemusena meister ja uusülaltoodud näites:

<<<<<<< HEAD master str ======= new str >>>>>>> uus
Konflikti lahendamiseks saame avada konfliktifaili programmi WinMerge abil.

See avab kahesuunalise liitmise tööriista:

Kirjeldatud loogikast lähtudes kirjutame merge käsu ümber merge_cmd järgmisel viisil:
merge_cmd() ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$?)
Tegelikult on mõlemad ülaltoodud võimalused samaväärsed.

2) Toimetame .gitconfig
tööriist = winmerge cmd = "winmerge" tool = winmerge cmd = "winmerge" trustExitCode = vale keepBackup = vale
viimane rida tühistab varukoopiafailide salvestamise hoidla kataloogi.

3) Kahe haru ühendamisel tekitame konflikti (vaata näidet DiffMerge abil).
git difftool master new // võrrelge kahte haru

Konflikti lahendamiseks filiaalide ühendamisel kasutage käsku
git mergetool

), nende võrdlusi, samuti nende GUI klientide võrdlusi. Arutati ka IDE pluginate üle, mis on mõeldud giti ja mercurialiga töötamiseks. Aga praktiliselt infot polnud visuaalse võrdluse ja konfliktide lahendamise tööriistade liitmise kohta.

Hiljuti “hüppasin” mercurilist (mida pean siiani mugavamaks ja loogilisemaks) gitile, sest valdav enamus minu jaoks huvitavatest projektidest kasutab git ja on githubis hostitud. Sellega seoses tekkis küsimus tööriistade arsenali läbivaatamise kohta, eriti küsimus tööriista valik visuaalne võrdlemine ja liitmine (diff ja merge). Jaoturi teabepuuduse täitmiseks otsustasin kirjutada selle miniarvustuse. Nagu öeldakse – tagaajamisel.

Lõike alt leiate ka näiteid Giti sätetest, mida saab kasutada koos DiffMerge'i ja WinMerge'iga Windowsi all. Ma arvan, et see säästab palju aega.

Nimi Iseärasused Platvorm

KDiff3

Git ja WinMerge

1) Lisage kataloogi c:/Git/libexec/git-core/mergetools/
winmerge fail järgmise sisuga:

Diff_cmd () ( "c:/Programmifailid (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 ) merge_cmd () ( "c:/Programmifailid (x86" )/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? )
Kui Gitil ei õnnestu muudatusi automaatselt liita, tekib liitmiskonflikt ja konfliktsele failile lisatakse liitmismarkerid (<<<<<<<, =======, и >>>>>>>). Need on vajalikud konflikti lahendamiseks kolmandate osapoolte tööriistade abil.
Vaatame faili readme.txt mis tekib harude liitmise tulemusena meister ja uusülaltoodud näites:

<<<<<<< HEAD master str ======= new str >>>>>>> uus
Konflikti lahendamiseks saame avada konfliktifaili programmi WinMerge abil.

See avab kahesuunalise liitmise tööriista:

Kirjeldatud loogikast lähtudes kirjutame merge käsu ümber merge_cmd järgmisel viisil:
merge_cmd() ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$?)
Tegelikult on mõlemad ülaltoodud võimalused samaväärsed.

2) Toimetame .gitconfig
tööriist = winmerge cmd = "winmerge" tool = winmerge cmd = "winmerge" trustExitCode = vale keepBackup = vale
viimane rida tühistab varukoopiafailide salvestamise hoidla kataloogi.

3) Kahe haru ühendamisel tekitame konflikti (vaata näidet DiffMerge abil).
git difftool master new // võrrelge kahte haru

Konflikti lahendamiseks filiaalide ühendamisel kasutage käsku
git mergetool

Tavaliselt genereerib diff väljundi järgmises vormingus:

$diff fail1 fail2 2c2< Helllo --- >Tere

Kuid seal on spetsiaalne parameeter käsurida(-y), mis käsib utiliidil andmeid väljastada kahes eraldi veerus. Ja see on näide sellisest väljundist:

$ diff -y fail1 fail2 Tere Tere Tere | Tere bye Bye

Ilmselgelt kasutamisel sellest vormingust väljundi sümbol "|" kasutatakse erinevate joonte tähistamiseks.

5. Ühesuguste ridade peitmine

Kui vaatate hoolikalt eelmise näite väljundit (ülaltoodud jaotisest 4), leiate, et käsurea võtme -y kasutamisel väljastab utiliit diff mitte ainult muudetud read, vaid ka failide identsed read see töötleb. Kui teil on vaja väljundist eemaldada identsed read, võite kasutada suvandit --suppress-common-lines.

$ diff -y --suppress-common-lines fail1 fail2 Tere | Tere

6. Muudetud koodi sisaldavate C-keele funktsioonide nimede trükkimine

Kui kasutate kahe faili võrdlemiseks diff-utiliiti lähtekood C-keeles saab kasutada spetsiaalset parameetrit (-p), mis käsib utiliidil kuvada funktsioonide nimed, mille koodis muutusi tuvastati. Oletame näiteks, et soovite võrrelda kahte järgmist C-lähtekoodi faili:

Faili nimega file1.c:

#kaasa void võrdle(float x, float y) ( if(x == y) // vale võrdlusviis ( printf("\n ARE VÕRDSED \n"); ) ) int main(void) ( võrdle(1,234, 1,56789 ) tagastab 0;

Faili nimega file2:

#kaasa void võrdle(float x, float y) ( if(x == y) ( printf("\n ON VÕRDSED \n"); ) ) int main(void) ( võrdle(1,234, 1,56789); tagasta 0; )

See on nende failide tavalise võrdluse tulemus:

$ diff fail1.c fail2.c 5c5< if(x == y) // некорректный способ сравнения --- >if(x == y)

Ja see on samade failide võrdlemise tulemus parameetri -p abil:

$ diff -p fail1.c fail2.c *** fail1.c 2016-12-29 11:45:36.587010816 +0530 --- file2.c 2016-12-29 11:46:39.823013274 +0530 **** *********** *** 2,8 **** void võrdle(float x, float y) ( ! if(x == y) // vale võrdlusviis ( printf("\n ARE VÕRDS \n"); ) --- 2.8 ---- void Võrdle(float x, float y) ( ! if(x == y) ( printf("\n VÕRDSED \n"); )

Ilmselgelt, kui kasutatakse käsurea suvandit -p, genereerib diff üksikasjalikuma väljundi, märgistades muudetud read hüüumärgiga ("!").

7. Alamkataloogide sisu rekursiivne võrdlemine

Diff-utiliit võimaldab ka alamkataloogide sisu rekursiivselt võrrelda, kuid see töörežiim ei ole vaikimisi aktiveeritud. Selle käsu kasutamisel pidasin silmas järgmist:

$ diff diff-failid/ teine-diff-failid/ diff-diff-failid/fail1 teine-diff-failid/fail1 1c1< Hi --- >ma diff diff-failid/fail2 teine-diff-failid/fail2 2c2< Hello --- >tere

utiliit diff võrdleb ainult kataloogidest pärit faile kõrgeim tase, kuid kui kasutatakse parameetrit -r (aktiveerib rekursiivse failivõrdlusrežiimi), võrreldakse isegi neid faile, mis asuvad alamkataloogides:

$ diff -r diff-failid/ teine-diff-failid/ diff -r diff-failid/fail1 teine-diff-failid/fail1 1c1< Hi --- >i diff -r diff-failid/fail2 teine-diff-failid/fail2 2c2< Hello --- >ello diff -r diff-failid/rohkem-diff-faile/fail1 teine-diff-failid/rohkem-diff-faile/fail1 1c1< Hi --- >i diff -r diff-failid/rohkem-diff-failid/fail2 teine-diff-failid/rohkem-diff-failid/fail2 2c2< Hello --- >tere

8. Käsitle puuduvaid faile tühjadena

Diff-utiliit toetab ka valikut, kus saate käskida puuduvaid faile tühjadena käsitleda. Kui võrrelda faile nimega fail1 ja fail3 (ja viimane fail ei eksisteeri), vaikimisi väljastab diff veateate:

$ diff fail1 fail3 diff: fail3: sellist faili või kataloogi pole

Pole midagi valesti; tegelikult on selline käitumine igati õigustatud. Kuid mõnikord soovite vältida tõrketeateid (võib-olla kestaskriptides diff kasutamisel), mille puhul saate kasutada suvandit -N, et käsitleda puuduvaid faile tühjadena ja jätkata failide võrdlemist.

$ diff -N fail1 fail3 1.5d0< Hi < < Helllo < < Bye

Järeldus

Kui olete seeria mõlemad artiklid hoolikalt läbi lugenud ja iseseisvalt kordanud kõiki neis käsitletud käsunäiteid, siis on täiesti võimalik väita, et olete omandanud kõik kõnealuse utiliidiga töötamise põhioskused. Loomulikult ei saanud me mitmes artiklis kõiki diff-ga seotud küsimusi arutada, kuid sellegipoolest mainiti neis ühel või teisel viisil selle utiliidi kõiki põhiomadusi ja funktsioone.

Kui soovite selle utiliidi kohta veidi rohkem teada, võite alati vaadata selle juhendi lehekülge. Ma arvan, et ei tasu veel kord mainida, et erinevate tööolukordade simuleerimiseks peaksite perioodiliselt kasutama erinevate parameetrite komplektidega utiliiti.



Kahe faili võrdlemine Linuxi terminalis (6)

Siin on minu lahendus sellele:

Mkdir temp mkdir tulemused cp /usr/share/dict/american-english ~/temp/american-english-dictionary cp /usr/share/dict/british-english ~/temp/british-english-dictionary cat ~/temp/american -inglise-sõnastik | wc -l > ~/results/count-american-english-dictionary cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english-dictionary > ~/results/common-english grep -Fxvf ~/results /common-english ~/temp/american-english-dictionary > ~/results/unique-american-english grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british -Inglise

Nimetatud on kaks faili "a.txt" Ja "b.txt", y millest on olemas sõnade loetelu. Nüüd tahan kontrollida, millistele sõnadele on lisatud "a.txt" ja pole sees "b.txt" .

Mul on vaja tõhusat algoritmi, kuna pean võrdlema kahte sõnaraamatut.

Kahe faili võrdlemiseks saate Linuxis kasutada diff-tööriista. Vajalike andmete filtreerimiseks saate kasutada valikud --muutatud-rühmavorming Ja --muutmata grupivorming .

Iga valiku jaoks sobiva rühma valimiseks saab kasutada kolme järgmist valikut.

    "% <" получить строки из FILE1

    "%>" saab read failist FILE2

    "" (tühi string) mõlema faili ridade eemaldamiseks.

Näiteks: diff --changed-group-format = "%<" --unchanged-group-format = "" file1.txt file2.txt

[ tmp]# kassi fail1.txt test üks test kaks katse kolm katse neli test kaheksa [ tmp]# kassi fail2.txt test üks test kolm test üheksa [ tmp]# diff --changed-group-format="%<" --unchanged-group-format="" file1.txt file2.txt test two test four test eight

Kui eelistate diff väljundstiili git diff , saate seda kasutada koos lipuga --no-index, et võrrelda faile, mis ei ole git-hoidlas:

Git diff --indeks puudub a.txt b.txt

Kasutades paari faili, millest igaühes on 200 000 failinime stringi, võrdlesin (sisseehitatud ajakäsuga) seda lähenemist ja mõningaid muid vastuseid siin:

Git diff --indeks puudub a.txt b.txt # ~1,2s komm -23<(sort a.txt) <(sort b.txt) # ~0.2s diff a.txt b.txt # ~2.6s sdiff a.txt b.txt # ~2.7s vimdiff a.txt b.txt # ~3.2s

comm näib olevat kõige kiirem, samas kui git diff --no-index näib olevat kiireim lähenemine diff-stiilis väljundile.

Värskendus 2018-03-25 Tegelikult võite lipu --no-index välja jätta, kui te ei asu git-hoidlas ja soovite võrrelda selles hoidlas olevaid esitamatuid faile. Manilehtedelt:

See vorm on mõeldud kahe failisüsteemi tee andmete võrdlemiseks. Suvandi -no-index saate välja jätta, kui käivitate käsu Giti hallatavas tööpuus ja vähemalt ühes teepunktist väljaspool tööpuud või kui käivitate käsu väljaspool Giti hallatavat tööpuud.

Kasutage kommi -13 (nõuab sorteeritud faile) :

$ kassifail1 üks kaks kolm $ kassifail2 üks kaks kolm neli $ komm -13<(sort file1) <(sort file2) four

Sorteerige need ja kasutage kommi:

Comm-23<(sort a.txt) <(sort b.txt)

comm võrdleb (sorteerib) sisendfaile ja väljastab vaikimisi kolm veergu: read, mis on ainulaadsed a-le, read, mis on ainulaadsed b-le, ja read, mis on mõlemas. Määrates -1 , -2 ja/või -3 saate vastava väljundi maha suruda. Seetõttu loetleb komm -23 ab ainult kirjed, mis on ainulaadsed a-le. Süntaks, mida ma kasutan, on<(...) для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.

Kui teil on vim installitud, proovige seda:

Vimdiffi fail1 fail2

Vim -d fail1 fail2

leiate selle fantastiliselt.

Veebihaldurid või veebisaitide omanikud peavad sageli võrdlema kahte faili sisu põhjal. Sellest artiklist saate teada, kuidas kahte faili omavahel võrrelda. Siin on kirjeldatud kõiki mulle teadaolevaid meetodeid tekstifailide ja skriptide (html, css, php ja nii edasi) võrdlemiseks.

Meetod 1. Meld

Meld- graafiline tööriist erinevuste saamiseks ja kahe faili, kahe kataloogi liitmiseks. Meld on visuaalne failide ja kataloogide võrdlemise ja ühendamise tööriist Linuxi jaoks. Meld on suunatud eelkõige arendajatele. Siiski võib see olla kasulik kõigile kasutajatele, kes vajavad head tööriista failide ja kataloogide võrdlemiseks.

Meldis saate võrrelda kahte või kolme faili või kahte või kolme kataloogi. Töökoopiat saate vaadata populaarsetest versioonihaldussüsteemidest, nagu CVS, Subversion, Bazaar-NG ja Mercurial. Meld on saadaval enamiku Linuxi distributsioonide jaoks (Ubuntu, Suse, Fedora jne) ja see on olemas nende peamistes hoidlates.

# aptitude install meld

2. meetod: kahe faili sisu võrdlemine WinMerge'is.

Tasuta programm WinMerge võimaldab võrrelda mitte ainult failide sisu, vaid ka tervete kaustade sisu. WinMerge on Windowsi avatud lähtekoodiga diferentseerimis- ja liitmistööriist. WinMerge saab võrrelda nii faile kui ka kaustu, kuvades erinevused visuaalsel tekstivormil, mida on lihtne mõista ja töödelda.

Pärast installimist avage menüükäsk "Fail" - "Ava". Valige võrdlemiseks failid. Selleks klõpsake nuppu "Sirvi" ja valige fail. Pärast failide valimist klõpsake nuppu "OK".

Samuti saate WinMerge'is faile redigeerida. Pärast võrdlusakna sulgemist pakub programm failide muudatuste salvestamist.

Meetod 3. diff

diff- failide võrdlemise utiliit, mis kuvab kahe faili erinevuse.

    Kataloogide võrdlemiseks kasutage seda käsku: $ diff -qr< current-directory> < backup-directory>

Meetod 4. Kompare

Kompare – kuvab failide erinevused. Oskab võrrelda failide või kataloogide sisu, samuti luua, kuvada ja rakendada paigafaile. Kompare on graafiline diff-utiliit, mis võimaldab leida failide erinevusi ja neid ka liita. Kirjutatud Qt-s ja mõeldud peamiselt KDE jaoks. Siin on selle peamised omadused:

    Toetab mitut diff-vormingut;

    Toetage linuxi failide ja kataloogide võrdlemist;

    Diff-failide vaatamise tugi;

    kohandatav liides;

    Failidele paikade loomine ja rakendamine.

5. meetod. Total Commanderi failide võrdlemine

    Toetatud operatsioonisüsteemid: Windows

Total Commanderil on failide võrdlemise tööriist sisu järgi, kus saate mitte ainult sisu võrrelda, vaid ka redigeerida ja ühest failist teise kopeerida.

Pärast Total Commanderi käivitamist - valige ühest paneelist (Insert key) võrdluseks esimene fail - teises paneelis avage kaust teise failiga ja asetage kursor sellele. Võrdluseks helistage programmile: "Failid → Võrdle sisu järgi."

Failis muudatuste tegemiseks klõpsake lihtsalt nuppu "Muuda". Programm pakub kopeerimis- ja tagasipööramis-, otsingu- ja kodeerimisfunktsioone. Kui olete failis muudatusi teinud, palutakse pärast võrdlusakna sulgemist muudatused salvestada.

6. meetod. Võrrelge faile rakenduses Notepad++

    Toetatud operatsioonisüsteemid: Windows, võib töötada Linuxis

Notepad++ ei saa faile võrrelda. Selle funktsiooni kuvamiseks Notepad++-s peate installima pistikprogrammi Võrdle.

Käivitage redaktor - minge menüüsse "Pluginad" - "Pluginahaldur" - "Kuva pistikprogrammide haldur". Valige uues aknas pistikprogramm "Võrdle" ja klõpsake nuppu "Install".

Pärast pistikprogrammi installimist avage kaks faili ja valige menüü "Pluginad" - "Võrdle" - "Võrdle (Alt+D)". Failide võrdluse tulemus esitatakse eraldi paneelidena. Erinevuste avastamise joonte vastas kuvatakse hoiatusmärk.

7. meetod: failide võrdlemine Windowsi käsuviiba abil

Võrdlus Windowsi käsurea (cmd.exe) abil ei võimalda teil faile redigeerida, kuid selle meetodi abil saate lihtsalt failide sisu võrrelda.

Windowsi käsurea avamiseks minge "Start" - "Kõik programmid" - "Accessories" - "Command Prompt" või vajutage klahvi "Windows + R", tippige cmd ja vajutage sisestusklahvi.

Sisestage käsureale käsk:

fc / N tee esimese faili tee teise faili