Linux - Comando diff

NOME

diff - confronto fra 2 files o fra 2 sottodirectories

SINOPSI

diff [opzioni] path_1 path_2

DESCRIZIONE

diff confronta 2 files o 2 sottodirectories riportando in output le differenze riscontrate. A prima vista diff puo' essere paragonato al comando fc (file compare) dell'MS-DOS, con la differenza di disporre di molte piu' opzioni possibili.
Nel caso piu' semplice, ovvero
diff file_1 file_2
diff effettua un confronto fra i 2 files file_1 e file_2, riportando le differenze riscontrate, o terminando senza messaggi nel caso che i due files siano identici.
Nel formato di default, ciascun gruppo di modifiche e' preceduto da un linea di informazioni riportante i numeri di linea di inizio e fine del gruppo per ciascuno dei due files (vecchio e nuovo) e dal tipo di modifica necessaria per riallinearli (c = change, a=append, d=delete). Di seguito ciascuna riga di output e' preceduta dal simbolo < se la linea deve essere eliminata dal vecchio file, e dal simbolo > se la linea deve essere aggiunta al nuovo file.
Altri formati di output possono essere selezionati attraverso una delle seguenti opzioni:
o -u o --unified output nel formato unificato.
o -U num o --unified=num output nel formato unificato con stampa di num linee di contesto.
o -c o --context output nel formato contestuale.
o -C num o --context=num output nel formato contestuale con stampa di num linee di contesto.
o -y o --side-by-side output nel formato side by side.
o -e o --ed l'output creato puo' costituire l'input per il comando ed (edit a linea di comando).
o -f o --forward-ed output come con -e ma in ordine di riga.
o -r o --rcs output nel formato rcs.
o -D name o --ifdef=name crea un output nel formato condizionale del C inserendo strutture #ifdef name.

Inoltre il formato di output puo' essere opportunamente personalizzato tramite l'uso di opzioni del tipo:
o --line-format=Lformat
o --old-line-format=Lformat
o --new-line-format=Lformat
o --unchanged-line-format=Lformat
oppure del tipo:
o --old-group-format=Gformat
o --new-group-format=Gformat
o --unchanged-group-format=Gformat
o --changed-group-format=Gformat
Lformat e' una stringa di formattazione al cui interno puo' contenere:
Stringa Descrizione
%L stampa il contenuto della linea
%l stampa il contenuto della linea, escluso il newline (ritorno a capo)
%[-][width][.[prec]]{doxX}n stampa il numero di riga nello stile di printf.
es. %04dn stampa il numero di linea nel formato decimale, utilizzando 4 cifre con riempimento di zeri non significativi.
%% stampa il carattere %
%c'C' stampa il carattere C
%c'\OOO' stampa il carattere avente il codice ottale OOO
Gformat e' una stringa di formattazione al cui interno puo' contenere:
Stringa Descrizione
%< stampa le linee del file_1
%> stampa le linee del file_2
%= stampa le linee comuni ai file_1 e file_2
%[-][width][.[prec]]{doxX}object stampa l'object con lo stile di printf.
object puo' assumere uno dei valori:
object Descrizione
f primo numero di linea del vecchio gruppo di modifiche
F primo numero di linea del nuovo gruppo di modifiche
l ultimo numero di linea del vecchio gruppo di modifiche
L ultimo numero di linea del nuovo gruppo di modifiche
n numero di linee del vecchio gruppo di modifiche (n=l-f+1)
N numero di linee del nuovo gruppo di modifiche (N=L-F+1)
e e=f-1 (vecchio gruppo di modifiche)
E E=F-1 (nuovo gruppo di modifiche)
m m=l+1 (vecchio gruppo di modifiche)
M M=L+1 (nuovo gruppo di modifiche)
%% stampa il carattere %
%c'C' stampa il carattere C
%c'\OOO' stampa il carattere avente il codice ottale OOO

Il comando diff dispone anche di altre numerose opzioni.
Per approfondimenti rimando alla documentazione disponibile con le man pages e all'help del comando.
Di seguito riporto le opzioni che ritengo piu' importanti:
o -r o --recursive effettua il confronto ricorsivo sulle sottodirectory trovate.
o -N o --new-file confrontando due directory, se un file viene trovato solamente su una delle due directory, allora diff tratta il file come se esistesse anche sull'altra directory, ma fosse vuoto. In questo modo i nuovi e i vecchi files sono trasmessi in output integralmente come differenza da aggiungere o da togliere totalmente dal vecchio file.
o -P o --unidirectional-new-file confrontando due directory, se un file viene trovato solo sulla seconda directory, diff tratta il file come se esistesse anche sulla prima directory, ma fosse vuoto. In questo modo i nuovi files sono trasmessi in output integralmente come differenza da aggiungere totalmente al vecchio file.
o -q o --brief riporta solamente se i files differiscono (non viene riportato il dettaglio delle differenze).
o -s o --report-identical-files se non sono trovate differenze tra 2 files viene emesso un apposito messaggio.
o -a o --text il confronto viene forzato fra file di tipo testo.
o -i o --ignore-case il confronto viene effettuato considerando equivalenti i caratteri maiuscoli e minuscoli.
o -b o --ignore-space-change il confronto viene effettuato ignorando le variazioni sul numero di caratteri di spaziatura e/o di tabulazione
o -w o --ignore-all-space il confronto viene effettuato ignorando tutti i caratteri di spaziatura e/o di tabulazione.
o -B o --ignore-blank-lines il confronto viene effettuato ignorando le differenze costituite dall'aggiunta o dalla eliminazione di linee bianche.
o -p o --show-c-function nell'output viene inserito anche il nome della funzione in cui sono state trovate le differenze. Utile per confronto fra file di sorgenti C.
o -v o --version riporta in output la versione del programma e termina l'esecuzione.
E' anche possibile controllare l'efficacia dell'algoritmo, tramite le opzioni:
o -d o --minimal ottimizza l'algoritmo riportando un minor numero di variazioni possibili. Con questa opzione, diff puo' impiegare molto piu' tempo.
o -H o --speed-large-files ottimizza l'algoritmo per il confronto di grossi files, con frequenti ma piccoli gruppi di variazioni.

VALORE DI RITORNO

Valore
ritornato
Significato
0 Nessuna differenza trovata
1 Sono state trovate delle differenze
2 Problemi nell'esecuzione del comando

ESEMPI

Al lato pratico, per creare un file di patch, il comando puo' essere sintetizzato in:
diff -u --recursive --new-file dir_old dir_new >file_patch
oppure (e' del tutto equivalente):
diff -urN dir_old dir_new >file_patch
L'opzione -u indica che venga utilizzato il formato unificato per l'output.
L'opzione -r o --recursive applica il procedimento ricorsivo ispezionando le sottodirectories.
Durante il confronto, se un file viene trovato solamente su una delle due directory ed e' specificato -N o --new-file, allora, ai fini del confronto, viene considerato che esista anche sull'altra directory, ma vuoto.
Gli argomenti dir_old e dir_new si riferiscono rispettivamente alla vecchia e nuova directory.
dir_new deve essere attualizzata con la effettiva directory a cui deve essere applicata la patch.

COMPATIBILITA'

Solaris diff [-bitw] [-c|-e|-f|-h|-n] file1 file2 AAaaiiII

VEDI ANCHE

man diff (man pages)
diff --help (visualizza il testo di aiuto)


Indice-Linux Indice Linux
Indice comandi Indice comandi
At Home Umberto Zappi Home Page