diff
è un'utilità della riga di comando che consente di confrontare due file riga per riga. Può anche confrontare il contenuto delle directory.
Il diff
Il comando è più comunemente usato per creare una patch contenente le differenze tra uno o più file che possono essere applicati usando la patch
comando.
Come utilizzare il diff
Comando #
La sintassi per diff
il comando è il seguente:
diff [OPTION]... FILES
Il diff
Il comando può visualizzare l'output in diversi formati con il formato normale, contesto e unificato i più comuni. L'output include informazioni su quali righe nei file devono essere modificate in modo che diventino identiche. Se i file corrispondono, non viene prodotto alcun output.
Per salvare l'output del comando in un file, utilizzare l'operatore di reindirizzamento:
diff file1 file2 > patch
In questo articolo, utilizzeremo i seguenti due file per spiegare come il diff
il comando funziona:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
file2Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora
Formato normale #
Nella sua forma più semplice quando il diff
comando viene eseguito su due file di testo senza alcuna opzione, produce un output nel formato normale:
diff file1 file2
L'output sarà simile a questo:
0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos
Il normale formato di output è costituito da una o più sezioni che descrivono le differenze. Ogni sezione ha questo aspetto:
change-command
< from-file-line...
---
> to-file-line...
0a1
, 2d2
e 4c4,5
sono comandi di modifica. Ogni comando di modifica contiene quanto segue, da sinistra a destra:
- Il numero di riga o l'intervallo di righe nel primo file.
- Un carattere di modifica speciale.
- Il numero di riga o l'intervallo di righe nel secondo file.
Il carattere di modifica può essere uno dei seguenti:
a
- Aggiungi le linee.c
- Cambia le linee.d
- Elimina le righe.
Il comando di modifica è seguito dalle righe complete che vengono rimosse (<
) e aggiunto al file (>
).
Spieghiamo l'output:
0a1
- Aggiungi la riga1
del secondo file all'inizio del file1 (dopo la riga0
).> Kubuntu
- La riga della seconda riga che viene aggiunta al primo file come descritto sopra.
2d2
- Elimina la riga2
nel primo fascicolo. Il2
dopo ild
il simbolo significa che se la riga non viene cancellata apparirà sulla riga2
nel secondo file.< Arch Linux
- la riga eliminata.
4c4,5
- Sostituisci (cambia) la riga5
nel primo file con le righe4-5
dal secondo file.< CentOS
- La riga nel primo file da sostituire.---
- Separatore.> Arch Linux
e> Centos
- Righe del secondo file che sostituiscono la riga del primo file.
Formato contesto #
Quando viene utilizzato il formato di output del contesto, diff
Il comando visualizza diverse righe di contesto attorno alle righe che differiscono tra i file.
Il -c
l'opzione dice diff
per produrre output nel formato del contesto:
diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,6 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,7 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
L'output inizia con i nomi ei timestamp se i file che vengono confrontati e una o più sezioni che descrivono le differenze. Ogni sezione ha questo aspetto:
***************
*** from-file-line-numbers ****
from-file-line...
--- to-file-line-numbers ----
to-file-line...
from-file-line-numbers
eto-file-line-numbers
- I numeri di riga o l'intervallo di righe separate da virgole rispettivamente nel primo e nel secondo file.from-file-line
eto-file-line
- Le righe che differiscono e le righe di contesto:- Le righe che iniziano con due spazi sono righe di contesto, le righe che sono le stesse in entrambi i file.
- Righe che iniziano con il simbolo meno (
-
) sono le righe che non corrispondono a nulla nel secondo file. Righe mancanti nel secondo file. - Righe che iniziano con il simbolo più (
+
) sono le righe che non corrispondono a nulla nel primo file. Righe mancanti nel primo file. - Righe che iniziano con il punto esclamativo (
!
) sono le righe che vengono modificate tra due file. Ogni gruppo di righe che iniziano con!
dal primo file ha una corrispondenza corrispondente nel secondo file.
Spieghiamo le parti più importanti dell'output:
- In questo esempio abbiamo solo una sezione che descrive le differenze.
*** 1,6 ****
e--- 1,7 ----
ci dice l'intervallo delle righe del primo e del secondo file che sono inclusi in questa sezione.- Righe
Ubuntu
,Debian
,Fedora
e l'ultima riga vuota è la stessa in entrambi i file. Queste righe iniziano con il doppio spazio. - Linea
- Arch Linux
dal primo file non corrisponde a nulla nel secondo file. Sebbene questa riga esista anche nel secondo file, le posizioni sono diverse. - Linea
+ Kubuntu
dal secondo file non corrisponde a nulla nel primo file. - Linea
! CentOS
dal primo file e righe! Arch Linux
e! CentOS
dal secondo file vengono modificati tra i file.
Per impostazione predefinita, il numero delle righe di contesto è tre. Per specificare un altro numero usa il -C
(--contexts
) opzione:
diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,5 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,6 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Formato unificato #
Il formato di output unificato è una versione migliorata del formato di contesto e produce un output più piccolo.
Usa -u
opzione per dire a diff
per stampare l'output nel formato unificato:
diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
-CentOS
+Arch Linux
+Centos
Fedora
L'output inizia con i nomi ei timestamp dei file e una o più sezioni che descrivono le differenze. Ogni sezione assume la forma seguente:
***************
@@ from-file-line-numbers to-file-line-numbers @@
line-from-files...
@@ from-file-line-numbers to-file-line-numbers @@
- Il numero di riga o l'intervallo delle righe del primo e del secondo file inclusi in questa sezione.line-from-files
- Le righe che differiscono e le righe di contesto:- Le righe che iniziano con due spazi sono righe di contesto, le righe che sono le stesse in entrambi i file.
- Righe che iniziano con il simbolo meno (
-
) sono le righe che vengono rimosse dal primo file. - Righe che iniziano con il simbolo più (
+
) sono le righe che vengono aggiunte dal primo file.
Ignora caso #
Come puoi notare negli esempi precedenti, il diff
il comando fa distinzione tra maiuscole e minuscole per impostazione predefinita.
Usa -i
opzione per dire a diff
ignora le maiuscole:
diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
+Arch Linux
CentOS
Fedora
Conclusione #
Il confronto dei file di testo per le differenze è una delle attività più comuni per gli amministratori di sistemi Linux.
Il diff
il comando confronta i file riga per riga. Per ulteriori informazioni, digita man diff
nel tuo terminale.
Se hai domande, lascia un commento qui sotto.