Jämför strängar i Linux-filer. Jämföra filer i Linux. diff kommandosyntax

Oavsett vilket system jag har för att mixtra med koden blir det förr eller senare för dyrt att jämföra olika versioner av källkoden. Här är enkla, gratis verktyg för att hitta skillnader i filer för Linux, Windows och Mac. Allmänt lanseringsformat – fil1 fil2.

Under Windows klarar uppgiften att jämföra innehållet i filer (och även kataloger, som ibland inte är värdelös) väl med WinMerge. Lätt. Inte bunden till någon IDE. Den är skriven i Qt och är plattformsoberoende - den ska också köras på niks. Förutom filer kan den också jämföra innehållet i kataloger (inklusive baserat på regexp-masker). Du kan lägga till ytterligare plugins.

WinMerge är ett plattformsoberoende verktyg för att jämföra filer och mer

Mac - opendiff. Det är en separat XCode-komponent. Fristående kan startas från kommandoraden. Den lyfter fram skillnaderna i blekgrå, men förresten kan den visa med pilar vad som har lagts till var. Kan utföra en sammanslagning (key -merge). Om du förutom filerna som jämförs anger en gemensam förfaderfil efter nyckeln -ancestor, så kommer jämförelsen att göras med den. Kan jämföra mappar.

opendiff verktyg - gratis filjämförelseverktyg på Mac

Linux – . Finns på alla plattformar (Windows, Mac, Linux) på grund av att den även är skriven i Qt. Kan jämföra upp till tre filer eller kataloger. Stöder möjligheten att slå samman ändringar, med redigeringsstöd för manuell konfliktlösning.

Verktyget kdiff3 - jämför två filer

UPPDATERING 2013-10-18

Om du arbetar i Gnom på niks är meld ett utmärkt val. Integration med populära versionskontrollsystem (Git, Subversion, etc.), sammanslagningsverktyg - automatisk sammanslagning, redigering med att fånga aktuella skillnader i farten, syntaxmarkering. Det finns portar för OS X Windows.

Tja, som en sista utväg (om du inte kan installera något från tredje part), en ful skillnad underifrån kommandorad(förinstallerat på nix-liknande system inklusive Mac och Solaris). Flexibel. Du kan leka med inställningarna länge och entusiastiskt för att kunna visa skillnader baserat på en mask (-F), få ​​en jämförelse i de vanliga två kolumnerna (key –side-by-side) etc. För stora, okända filer föredrar jag utdata i ett "kontextuellt" format, när inte bara de ändrade raderna visas, utan även de som gränsar till dem.

För att jämföra fler än två filer kan diff3 vara lämpligt.

Ibland finns det ett behov av att jämföra flera filer med varandra. Detta kan vara användbart när man analyserar skillnaderna mellan flera versioner av en konfigurationsfil eller helt enkelt för att jämföra olika filer. Linux har flera verktyg för detta, både via terminalen och i det grafiska gränssnittet.

I den här artikeln kommer vi att titta på hur Linux-filjämförelse utförs. Låt oss titta på de mest användbara metoderna, både för terminalen och i grafiskt läge. Låt oss först titta på hur man jämför en Linux-fil med hjälp av diff-verktyget.

  • Jämförelse av diff-filer

    Diff linux-verktyget är ett program som körs i konsolläge. Dess syntax är mycket enkel. Ring verktyget, passera nödvändiga filer, och ställ även in alternativ om det behövs:

    $ diff alternativ fil1 fil2

    Du kan överföra mer än två filer om det behövs. Innan vi går vidare till exemplen, låt oss titta på verktygsalternativen:

    • -q- visa endast filskillnader;
    • -s- visa endast matchande delar;
    • -Med- visa erforderligt antal rader efter matcher;
    • -u- mata bara ut det erforderliga antalet rader efter skillnader;
    • -y- Visa i två kolumner;
    • -e- utdata i ed script-format;
    • -n- utdata i RCS-format;
    • -a- jämför filer som text, även om de inte är text;
    • -t- ersätt flikar med mellanslag i utgången;
    • -l- dela upp i sidor och lägg till stöd för personsökning;
    • -r- rekursiv jämförelse av mappar;
    • -jag- ignorera fall;
    • -E- ignorera ändringar i flikar;
    • -Z- ignorera mellanslag i slutet av raden;
    • -b- ignorera mellanslag;
    • -B- ignorera tomma rader.

    Dessa var de viktigaste alternativen för verktyget, låt oss nu titta på hur man jämför Linux-filer. I utdata från verktyget, förutom att direkt visa ändringarna, visar det en rad där det anges på vilken rad och vad som gjordes. Följande symboler används för detta:

    • a- Lagt till;
    • d- raderade;
    • c- ändrats.

    Dessutom kommer linjer som skiljer sig att indikeras med symbolen<, а те, которые совпадают - символом >.

    Här är innehållet i våra testfiler:

    Låt oss nu jämföra diff-filerna:
    $diff fil1 fil2

    Som ett resultat får vi raden: 2,3c2,4. Det betyder att rad 2 och 3 har ändrats. Du kan använda alternativ för att ignorera skiftläge:
    $ diff -i fil1 fil2

    Resultatet kan ritas i två kolumner:
    $ diff -y fil1 fil2

    Och med alternativet -u kan du skapa en patch, som sedan kan appliceras på samma fil av en annan användare:
    $ diff -u fil1 fil2

    För att bearbeta flera filer i en mapp är det bekvämt att använda alternativet -r:
    $ diff -r ~/tmp1 ~/tmp2

    För enkelhetens skull kan du omdirigera verktygsutgången direkt till en fil:
    $ diff -u fil1 fil2 > fil.patch

    Som du kan se är allt väldigt enkelt. Men inte särskilt bekvämt. Det är roligare att använda grafiska verktyg.

    Jämföra Linux-filer med GUI

    Det finns flera utmärkta verktyg för att jämföra filer på Linux i ett GUI. Du kan enkelt ta reda på hur du använder dem. Låt oss titta på några av dem:

    1. Jämför

    Kompare är ett grafiskt diff-verktyg som låter dig hitta skillnader i filer och även slå samman dem. Skrivet i Qt och designat främst för KDE. Här är dess huvudfunktioner:

  • Stöder flera diff-format;
  • Stöd jämförelse av linux-filer och kataloger;
  • Stöd för visning av diff-filer;
  • Anpassningsbart gränssnitt;
  • Skapa och applicera patchar på filer.

2. DiffMerge

DiffMerge är ett plattformsoberoende program för att jämföra och slå samman filer. Låter dig jämföra två eller tre filer. On-the-fly linjeredigering stöds.

Egenheter:

  • Stöd för katalogjämförelse;
  • Integration med filvisare;
  • Anpassningsbar.

3. Meld

Det är ett lättviktigt verktyg för att jämföra och slå samman filer. Det låter dig jämföra filer, kataloger och även utföra versionskontrollfunktioner. Programmet skapades för utvecklare och har följande funktioner:

  • Jämförelse av två och tre filer;
  • Använda anpassade typer och ord;
  • Automatiskt sammanslagningsläge och åtgärder med textsidor;
  • Stöd för Git, Mercurial, Subversion, Bazar och mycket mer.

4. Diffus

Diffuse är ett annat populärt och ganska enkelt verktyg för att jämföra och slå samman filer. Det är skrivet i Python. Två huvudfunktioner stöds - filjämförelse och versionskontroll. Du kan redigera filer medan du tittar. Huvud funktioner:

  • Syntaxmarkering;
  • Kortkommandon för enkel navigering;
  • Stöder obegränsade avbokningar;
  • Unicode-stöd;
  • Stöd för Git, CVS, Darcs, Mercurial, RCS, Subversion, SVK och Monotone.

5.XXdiff

XXdiff är ett gratis och mycket kraftfullt verktyg för att jämföra och slå samman filer. Men programmet har flera nackdelar. Detta är bristen på stöd för Unicode och filredigering.

Egenheter:

  • Grund eller rekursiv jämförelse av en eller två filer och kataloger;
  • Att lyfta fram skillnader;
  • Interaktiv förening;
  • Stöd för externa diff-verktyg som GNU Diff, SIG Diff, Cleareddiff och mer;
  • Utökningsbarhet via skript;
  • Anpassningsbarhet.

6. KDiff3

KDiff3 är ett annat utmärkt, gratis verktyg för att jämföra filer i KDE:s skrivbordsmiljö. Det är en del av KDevelops programsvit och körs på alla plattformar, inklusive Windows och MacOS. Du kan jämföra två linux-filer för två eller tre, eller till och med jämföra kataloger. Här är huvudfunktionerna:

  • Visa skillnader rad för rad och tecken för tecken;
  • Automerge-stöd;
  • Hantera sammanslagningskonflikter;
  • Unicode-stöd;
  • Visa skillnader;
  • Stöder manuell utjämning.

Idag blev jag ombedd att jämföra små styckerubriker i två stora textfiler. Alla titlar började med en asterisk, så det var inga problem. Men det är inte alls intressant, och mer av tristess än för verklig användning ville jag hitta ett sätt att extrahera rubriker från vilken text som helst. Tyvärr hittades ingen 100% arbetsmetod, men i slutet av artikeln kommer det att finnas en intressant lösning för att förvandla dubbla eller fler tomma rader till en tom rad.

Till att börja med är det enklaste alternativet när du bara behöver jämföra 2 textfiler.
Det finns ett diff-kommando för detta. Syntaxen är som följer:

diff första_fil andra_fil

Det är mycket bekvämare att omdirigera utdata till en fil med tillägget diff

diff first_file second_file > profit.diff

Om du öppnar en sådan fil i en textredigerare kommer syntaxen att markeras och analysprocessen blir enklare.

Programmet jämför strängar och om en av filerna innehåller en rad som inte finns i den andra, då en ">" eller "

För att få utdata från rader som börjar med ett tecken (i det här fallet är det *), är det bäst att använda grep kommando. Om du till exempel vill skicka till fil 1.txt alla rader som börjar med "*" i filen file.txt, bör du köra detta för att göra detta

grep "^*" "file.txt" > 1.txt

När det gäller att extrahera rubriker från text av vilket format som helst, blev det inget vettigt av det.
Men låt inte koden försvinna, låt den ligga här:

#!/bin/bash
n=$1
st=`sed -n '/^$/p' $n| wc -l | awk "(print$1)" #räkna antalet tomma rader
sed -nr ‘/^.(100)/!p’ $n > /tmp/copy2$n #enbart intresserad av rader med mindre än 100 tecken (rubriker är troligen inte längre)
sed -n “1p” /tmp/copy2$n > ‘Headers’$n # Vi tar ut den första raden (det kommer att vara rubriken)
#
tr 'n' '^' /tmp/copy$n # Ändra alla bindestreck till ^-tecknet
#
#Ändra sekvensen av ^^^ (etc.) med dubbla bindestreck (som resulterar i en tom rad)
#Och ändra singeln ^ till ett enda bindestreck (utan en tom rad).
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
#
medan [ $st -gt 0 ] #loop samma antal gånger som tomma termer.
do
st=$[$st-1]
sed -i ‘1,/^$/ d’ /tmp/copy$n #radera alla rader upp till den första tomma raden (inklusive sig själv)
sed -n “1p” /tmp/copy$n >> ‘Headers ‘$n #lägg till den återstående raden i filen
Gjort

Den här koden klarade sig förresten bra med att jämföra filerna som skickades till mig, men det var problem med riktiga böcker.

Vanligtvis genererar diff utdata i följande format:

$diff fil1 fil2 2c2< Helllo --- >Hallå

Men det finns en speciell kommandoradsparameter (-y) som säger åt verktyget att mata ut data i två separata kolumner. Och det här är ett exempel på sådan utdata:

$ diff -y file1 file2 Hej Hej Hej | Hej hej hej

Uppenbarligen, när du använder detta utdataformat, "|"-tecknet används för att markera olika linjer.

5. Döljer identiska rader

Om du tittar noggrant på utdata från föregående exempel (från avsnitt 4 ovan), kommer du att upptäcka att när du använder kommandoradsalternativet -y, matar diff-verktyget inte bara de ändrade raderna utan också de identiska raderna i filerna den bearbetar. Om du behöver ta bort identiska rader från utgången kan du använda alternativet --suppress-common-lines.

$ diff -y --suppress-common-lines fil1 fil2 Hej | Hallå

6. Skriver ut namnen på C-språkfunktioner som innehåller modifierad kod

När du använder diff-verktyget för att jämföra två C-källkodsfiler kan du använda ett speciellt alternativ (-p) som säger åt verktyget att skriva ut namnen på funktioner där ändringar upptäcktes. Anta till exempel att du vill jämföra följande två C-källkodsfiler:

Fil med namnet file1.c:

#omfatta void compare(float x, float y) ( if(x == y) // felaktigt sätt att jämföra ( printf("\n ÄR LIKA med \n"); ) ) int main(void) ( compare(1.234, 1.56789 ); returnera 0; )

Fil med namnet fil 2:

#omfatta void compare(float x, float y) ( if(x == y) ( printf("\n ÄR LIKA med \n"); ) ) int main(void) ( compare(1.234, 1.56789); return 0; )

Detta är resultatet av en normal jämförelse av dessa filer:

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

Och detta är resultatet av att jämföra samma filer med parametern -p:

$ diff -p fil1.c fil2.c *** fil1.c 2016-12-29 11:45:36.587010816 +0530 --- fil2.c 2016-12-29 11:46:39.823013274 +0530 **** *********** *** 2.8 **** void compare(float x, float y) ( ! if(x == y) // felaktigt sätt att jämföra ( printf("\n ÄR LIKA med \n"); ) --- 2,8 ---- void compare(float x, float y) ( ! if(x == y) ( printf("\n ÄR LIKA med \n"); )

Uppenbarligen, om kommandoradsalternativet -p används, genererar diff mer utförlig utdata, och markerar modifierade rader med ett utropstecken ("!").

7. Rekursiv jämförelse av innehållet i underkataloger

Diff-verktyget låter dig också jämföra innehållet i underkataloger rekursivt, men detta funktionsläge är inte aktiverat som standard. Jag menade att när du använder det här kommandot:

$ diff diff-filer/ andra-diff-filer/ diff diff-filer/fil1 andra-diff-filer/fil1 1c1< Hi --- >i diff diff-filer/fil2 andra-diff-filer/fil2 2c2< Hello --- >hej

Diff-verktyget kommer endast att jämföra filer från toppnivåkataloger, men om du använder parametern -r (aktiverar det rekursiva filjämförelseläget), kommer det att jämföra även de filer som finns i underkataloger:

$ diff -r diff-filer/ andra-diff-filer/ diff -r diff-filer/fil1 andra-diff-filer/fil1 1c1< Hi --- >i diff -r diff-filer/fil2 andra-diff-filer/fil2 2c2< Hello --- >ello diff -r diff-filer/fler-diff-filer/fil1 andra-diff-filer/fler-diff-filer/fil1 1c1< Hi --- >i diff -r diff-filer/fler-diff-filer/fil2 andra-diff-filer/fler-diff-filer/fil2 2c2< Hello --- >hej

8. Behandla saknade filer som tomma

Diff-verktyget stöder också ett alternativ där du kan säga åt det att behandla saknade filer som tomma. Om du jämför filer med namnet fil1 och fil3 (och den senare filen existerar inte), kommer diff som standard att ge ett felmeddelande:

$ diff fil1 fil3 diff: fil3: Ingen sådan fil eller katalog

Det är inget fel; i själva verket är detta beteende helt berättigat. Men det finns tillfällen då du vill undvika felmeddelanden (kanske när du använder diff i skript skal), där du kan använda alternativet -N för att behandla saknade filer som tomma och fortsätta jämföra filer.

$ diff -N fil1 fil3 1.5d0< Hi < < Helllo < < Bye

Slutsats

Om du noggrant har läst båda artiklarna i serien och självständigt upprepat alla kommandoexempel som diskuteras i dem, är det fullt möjligt att säga att du har behärskat alla grundläggande färdigheter för att arbeta med verktyget i fråga. Naturligtvis kunde vi inte diskutera alla frågor relaterade till diff i flera artiklar, men ändå nämndes alla huvudfunktioner och funktioner i detta verktyg i dem på ett eller annat sätt.

Om du vill veta lite mer om det här verktyget kan du alltid hänvisa till dess manualsida. Jag tycker att det inte är värt att nämna ännu en gång att du regelbundet bör använda verktyget med olika uppsättningar parametrar för att simulera olika arbetssituationer.

För att jämföra två eller flera filer i Linux finns kommandot diff. Den kan jämföra både enskilda filer och kataloger. Låt oss titta på syntaxen, alternativen för kommandot diff och några användningsexempel.

diff kommandosyntax

Kommandot diff har följande syntax:

Diff [alternativ] filer-eller-kataloger

Vi anger alternativ och tillhandahåller två eller flera filer eller kataloger som vi behöver jämföra.

diff kommandoalternativ

Låt oss titta på huvudalternativen för kommandot diff. Jag kommer bara att överväga de alternativ som jag använder oftast.

-EIgnorera ändringar som orsakas av att ett tabbtecken lagts till i texten.
-bIgnorera ändringar som orsakas av att lägga till mellanslag.
-wIgnorera ändringar som innebär att du lägger till mellanslag och flikar.
-Bignorera nya tomma rader.
-p (eller --show-c-funktion)visa namnet på C-språkfunktionen där ändringar hittades.
-y (eller --side-by-side)visa resultaten i två kolumner.
-rbläddra i kataloger rekursivt.
-X FILexkludera från sökfiler vars namn matchar mönster i FILE-filen.
-d (eller --minimal)försök hitta så få ändringar som möjligt (det vill säga utesluta falska positiva).

Exempel på användning av kommandot diff

Jämför två textfiler

För att helt enkelt jämföra två textfiler med namnet myfile1 och myfile2, kör kommandot i terminalen:

Diff minfil1 minfil2

Det är bekvämt att omdirigera utdata från diff-kommandot till en fil med diff-tillägget. Majoritet textredigerare Linux-system som Gedit känner igen den här filen och markerar dess syntax. För att rikta resultatet av jämförelsen till filen changes.diff måste du använda symbolen för strömomdirigering (>):

Diff minfil1 minfil2 > ändringar.diff

Jämförelse av kataloger som innehåller textfiler

Låt oss titta på ett exempel på att jämföra två kataloger (mydir1 och mydir2) som innehåller textfiler. Den största skillnaden här från exemplet ovan är att vi kommer att lägga till alternativet -r, vilket betyder att det rekursivt kommer att gå igenom filer i kataloger.

Diff -r mydir1 mydir2 > ändringar.diff

Låt oss nu anta att katalogerna där vi jämför filer innehåller mycket "skräp" som vi inte bör jämföra. Låt oss skapa en fil excludeFiles och skriva in mönster och namn på filer som vi inte ska jämföra. Till exempel kan innehållet i excludeFiles se ut så här:

*.o ChangeLog* *.bak *.exe

Låt oss nu berätta för diff-kommandot att använda vår excludeFiles-fil när du jämför kataloger:

Diff -r -X excludeFiles mydir1 mydir2 > ändringar.diff

Således jämför vi filer vars namn inte matchar mönstren i excludeFiles-filen, till exempel vasya.exe eller ChangeLog12.

Låt oss lägga till några fler alternativ som beskrivs ovan för att förbättra jämförelseresultatet:

Diff -rwBd -X excludeFiles mydir1 mydir2 > ändringar.diff

Vi jämför filer i katalogerna mydir1 och mydir2, ignorerar ändringar på grund av att vi lägger till tomma rader, blanksteg, tabbar och använder även filnamnsmönster i excludeFiles för att utesluta onödiga filer från jämförelsen.

Slutsats

För mer information om hur du använder kommandot diff i din Linux-system du kan få det genom att köra kommandot:

Man diff

Det finns också program som låter dig jämföra filer med hjälp av GUI. Till exempel programmet Meld som visuellt visar var och vad som har ändrats i filerna.


Topp