Come confrontare due file di testo nel terminale Linux

Hai bisogno di vedere le differenze tra due revisioni di un file di testo? Allora diff è il comando che ti serve. Questo tutorial mostra come utilizzare diff su Linux e macOS, in modo semplice.

Immergersi nel diff

Il comando diff confronta due file e produce un elenco delle differenze tra i due. Per essere più precisi, produce un elenco delle modifiche che dovrebbero essere apportate al primo file, per farlo corrispondere al secondo file. Se lo tieni a mente, troverai più facile capire l’output di diff. Il comando diff è stato progettato per trovare differenze tra i file di codice sorgente e per produrre un output che potrebbe essere letto e utilizzato da altri programmi, come il patch comando. In questo tutorial, esamineremo i modi più utili per l’uomo per utilizzare diff.

Immergiamoci e analizziamo due file. L’ordine dei file sulla riga di comando determina quale file diff considera essere il “primo file” e quale considera il “secondo file”. Nell’esempio seguente alpha1 è il primo file e alpha2 è il secondo file. Entrambi i file contengono l’estensione alfabeto fonetico ma il secondo file, alpha2, ha subito ulteriori modifiche in modo che i due file non siano identici.

Possiamo confrontare i file con questo comando. Digita diff, uno spazio, il nome del primo file, uno spazio, il nome del secondo file, quindi premi Invio.

diff alpha1 alpha2

Come analizziamo quell’output? Una volta che sai cosa cercare, non è poi così male. Ogni differenza è elencata a turno in una singola colonna e ogni differenza è etichettata. L’etichetta contiene numeri su entrambi i lati di una lettera, come 4c4. Il primo numero è il numero di riga in alpha1 e il secondo numero è il numero di riga in alpha2. La lettera al centro può essere:

c: La riga nel primo file deve essere modificata in modo che corrisponda alla riga nel secondo file.
d: La riga nel primo file deve essere cancellata per corrispondere al secondo file.
a: È necessario aggiungere del contenuto extra al primo file per farlo corrispondere al secondo file.

Il 4c4 nel nostro esempio ci dice che la riga quattro di alpha1 deve essere modificata in modo che corrisponda alla riga quattro di alpha2. Questa è la prima differenza tra i due file trovati da diff.

Le righe che iniziano con si riferiscono al secondo file, alpha2. La riga Dave ci dice che la parola Dave è il contenuto della riga quattro in alpha2. Per riassumere, quindi, dobbiamo sostituire Delta con Dave sulla riga quattro in alpha1, per fare in modo che quella riga corrisponda in entrambi i file.

Il cambio successivo è indicato dal 12c12. Applicando la stessa logica, questo ci dice che la riga 12 in alpha1 contiene la parola Lima, ma la riga 12 di alpha2 contiene la parola Linux.

La terza modifica si riferisce a una riga che è stata eliminata da alpha2. L’etichetta 21d20 viene decifrata poiché “la riga 21 deve essere eliminata dal primo file per sincronizzare entrambi i file dalla riga 20 in poi.” Il

La quarta differenza è etichettata 26a26,28. Questa modifica si riferisce a tre righe aggiuntive che sono state aggiunte ad alpha2. Notare il 26,28 nell’etichetta. I numeri di due righe separati da una virgola rappresentano un intervallo di numeri di riga. In questo esempio, l’intervallo va dalla riga 26 alla riga 28. L’etichetta viene interpretata come “alla riga 26 nel primo file, aggiungi le righe da 26 a 28 dal secondo file”. Ci vengono mostrate le tre linee in alpha2 che devono essere aggiunte ad alpha1. Questi contengono le parole Quirk, Strange e Charm.

One-Liners scattanti

Se tutto quello che vuoi sapere è se due file sono uguali, usa l’opzione -s (riporta file identici).

diff -s alpha1 alpha3

Output del comando diff con l'opzione -s

È possibile utilizzare l’opzione -q (breve) per ottenere un’affermazione altrettanto concisa su due file diversi.

diff -q alpha1 alpha2

Output del comando diff con l'opzione -q

Una cosa a cui prestare attenzione è che con due file identici l’opzione-q (brief) si blocca completamente e non riporta nulla.

Una vista alternativa

L’opzione -y (fianco a fianco) utilizza un layout diverso per descrivere le differenze di file. Spesso è conveniente utilizzare l’opzione -W (larghezza) con la vista affiancata, per limitare il numero di colonne visualizzate. Ciò evita brutte righe che rendono difficile la lettura dell’output. Qui abbiamo detto a diff di produrre una visualizzazione affiancata e di limitare l’output a 70 colonne.

diff -y -W 70 alpha1 alpha2

Uscita del comando diff con visualizzazione affiancata

Il primo file sulla riga di comando, alpha1, è mostrato a sinistra e la seconda riga sulla riga di comando, alpha2, è mostrata a destra. Le righe di ogni file vengono visualizzate una accanto all’altra. Ci sono caratteri indicatori accanto a quelle righe in alpha2 che sono state modificate, eliminate o aggiunte.

|: Una riga che è stata modificata nel secondo file.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Una riga che è stata aggiunta al secondo file che non si trova nel primo file.

Se preferisci un riepilogo affiancato più compatto delle differenze tra i file, utilizza l’opzione –suppress-common-lines. Ciò forza diff a elencare solo le righe modificate, aggiunte o eliminate.

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

Output del comando diff con l'opzione --suppress-common-lines

Aggiungi un tocco di colore

Un’altra utility chiamata colordiff aggiunge l’evidenziazione del colore all’output del diff. Ciò rende molto più facile vedere quali linee presentano differenze.

Usa apt-get per installare questo pacchetto sul tuo sistema se stai usando Ubuntu o un’altra distribuzione basata su Debian. Su altre distribuzioni Linux, utilizza invece lo strumento di gestione dei pacchetti della tua distribuzione Linux.

sudo apt-get install colordiff

Usa colordiff proprio come faresti con diff.

Output del comando colordiff senza opzioni

In effetti, colordiff è un wrapper per diff e diff fa tutto il lavoro dietro le quinte. Per questo motivo, tutte le opzioni diff funzioneranno con colordiff.

Output del comando colordiff con l'opzione --suppress-common-lines

Fornire un contesto

Per trovare una via di mezzo tra avere tutte le linee nei file visualizzati sullo schermo e avere solo le linee modificate elencate, possiamo chiedere a diff di fornire un po ‘di contesto. Ci sono due modi per farlo. Entrambi i modi raggiungono lo stesso scopo, ovvero mostrare alcune righe prima e dopo ogni riga modificata. Sarai in grado di vedere cosa sta succedendo nel file nel punto in cui è stata rilevata la differenza.

Il primo metodo utilizza l’opzione -c (contesto copiato).

colordiff -c alpha1 alpha2

Output di colordiff con l'opzione -c

L’output diff ha un’intestazione. L’intestazione elenca i due nomi di file e le relative ore di modifica. Ci sono asterischi

prima del nome del primo file e trattini (-) prima del nome del secondo file. Asterischi e trattini verranno utilizzati per indicare a quale file appartengono le righe nell’output.

Una linea di asterischi con 1,7 al centro indica che stiamo guardando le linee da alfa1. Per essere precisi, stiamo guardando le righe da uno a sette. La parola Delta viene contrassegnata come modificata. Accanto ha un punto esclamativo (!) Ed è rosso. Ci sono tre righe di testo invariato visualizzate prima e dopo quella riga in modo che possiamo vedere il contesto di quella riga nel file.

La linea di trattini con 1,7 al centro ci dice che ora stiamo guardando le linee da alpha2. Di nuovo, stiamo esaminando le righe da uno a sette, con la parola Dave sulla riga quattro contrassegnata come diversa.

colordiff -C 2 alpha1 alpha2

Tre righe di contesto sopra e sotto ogni modifica sono il valore predefinito.  Puoi specificare quante righe di contesto vuoi che diff fornisca.  Per fare ciò, utilizza l'opzione -C (contesto copiato) con la

Output di colordiff con l’opzione -C 2

colordiff -u alpha1 alpha2

La seconda opzione diff che offre il contesto è l'opzione -u (contesto unificato).

Output di colordiff con l’opzione -u

Come prima, abbiamo un’intestazione sull’output. I due file vengono denominati e vengono visualizzati i relativi tempi di modifica. Sono presenti trattini (-) prima del nome di alpha1 e segni più (+) prima del nome di alpha2. Questo ci dice che i trattini saranno usati per riferirsi ad alfa1 e i segni più saranno usati per riferirsi ad alfa2. Sparse in tutto l’elenco ci sono righe che iniziano con i segni (@). Queste linee segnano l’inizio di ogni differenza. Ci dicono anche quali righe vengono mostrate da ogni file.

Ci vengono mostrate le tre righe prima e dopo la riga contrassegnata come diversa in modo da poter vedere il contesto della riga modificata. Nella visualizzazione unificata, le linee con la differenza vengono mostrate una sopra l’altra. La riga da alpha1 è preceduta da un trattino e la riga da alpha2 è preceduta da un segno più. Questo display ottiene in otto righe ciò che il display contestuale copiato sopra ha richiesto quindici per fare.

colordiff -U 2 alpha1 alpha2

Come ti aspetteresti, possiamo chiedere a diff di fornire esattamente il numero di righe di contesto unificato che vorremmo vedere.  Per fare ciò, utilizza l'opzione -U (contesto unificato) con la

Output di colordiff con l’opzione -U 2

Ignorare lo spazio bianco e le maiuscole

colordiff -y -W 70 test4 test5

Analizziamo altri due file, test4 e test5.  Questi hanno i nomi sei dei supereroi in loro.

Output di colordiff sui file test4 e test5

I risultati mostrano che diff non trova nulla di diverso con le linee Black Widow, Spider-Man e Thor. Segnala i cambiamenti con le linee Captain America, Ironman e Hulk.

Allora cosa c’è di diverso? Bene, nel test5 Hulk è scritto con una “h” minuscola e Captain America ha uno spazio in più tra “Captain” e “America”. OK, è evidente, ma cosa c’è di sbagliato nella linea Ironman? Non ci sono differenze visibili. Ecco una buona regola pratica. Se non puoi vederlo, la risposta è uno spazio bianco. C’è quasi certamente uno o due spazi vaganti, o un carattere di tabulazione, alla fine di quella riga.

Se non ti interessano, puoi istruire diff di ignorare tipi specifici di differenza di riga, tra cui:
-i: ignora le differenze nel caso.
-Z: ignora lo spazio vuoto finale.
-b: ignora le modifiche nella quantità di spazio bianco.

-w: ignora tutte le modifiche agli spazi vuoti.

colordiff -i -y -W 70 test4 test5

Chiediamo a diff di controllare di nuovo quei due file, ma questa volta per ignorare eventuali differenze nel caso.

l’output di colordiff ignora le maiuscole

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

Le linee con

L’output di colordiff ignora gli spazi vuoti finali

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

Come sospettato, lo spazio vuoto finale deve essere stato la differenza sulla riga Ironman perché diff non segnala più una differenza per quella riga.  Questo lascia Captain America.  Chiediamo a diff di ignorare maiuscole e minuscole e di ignorare tutti i problemi di spazio bianco.

L’output di colordiff ignora tutti gli spazi bianchi

Dicendo a diff di ignorare le differenze che non ci interessano, diff ci dice che, per i nostri scopi, i file corrispondono. Il comando diff ha molte più opzioni, ma la maggior parte di esse riguarda la produzione di output leggibile dalla macchina. Questi possono essere rivisti su Linuxpagina man

. Le opzioni che abbiamo usato negli esempi precedenti ti permetteranno di rintracciare tutte le differenze tra le versioni dei tuoi file di testo, usando la riga di comando e bulbi oculari umani.