risposta-alla-domanda-sullo-sviluppo-web-bd.com

Dati due alberi di directory, come posso scoprire quali file differiscono?

Se voglio trovare le differenze tra due alberi di directory, di solito eseguo solo:

diff -r dir1/ dir2/

Questo emette esattamente quali sono le differenze tra i file corrispondenti. Mi interessa solo ottenere un elenco di file corrispondenti il ​​cui contenuto è diverso. Supponevo che si trattasse semplicemente di passare un'opzione da riga di comando a diff, ma non ho trovato nulla nella pagina man.

Eventuali suggerimenti?

692
Mansoor Siddiqui

Hai detto Linux, quindi sei fortunato (almeno dovrebbe essere disponibile, non sicuro quando è stato aggiunto):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

Dovrebbe fare quello che ti serve.

Se vuoi anche vedere le differenze per i file che potrebbero non esistere in nessuna delle due directory:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
990
Mark Loeser

Il comando che uso è:

diff -qr dir1/ dir2/

È esattamente lo stesso di Mark :) Ma la sua risposta mi ha infastidito perché utilizza diversi tipi di bandiere, e mi ha fatto guardare due volte. Usando i flag più dettagliati di Mark sarebbe:

diff  --brief --recursive dir1/ dir2/

Mi scuso per la pubblicazione quando l'altra risposta è perfettamente accettabile. Non potevo fermarmi ... lavorare per essere meno pedante.

279
FPC

Mi piace usare git diff --no-index dir1/ dir2/, perché può mostrare le differenze di colore (se hai questa opzione impostata nella tua git config) e perché mostra tutte le differenze in un lungo output paginato usando "less".

89
Alan Porter

Questi due comandi fanno sostanzialmente la cosa richiesta:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

La scelta tra di loro dipende dalla posizione di dir1 e dir2:

Quando le directory risiedono su due unità separate, diff supera le prestazioni di rsync. Ma quando le due directory confrontate si trovano sulla stessa unità, rsync è più veloce. È perché diff mette un carico quasi uguale su entrambe le directory in parallelo, massimizzando il carico sulle due unità.

rsync calcola i checksum in grandi blocchi prima di confrontarli effettivamente. Questo raggruppa le operazioni di I/O in grandi blocchi e porta a un'elaborazione più efficiente quando le cose si svolgono su una singola unità.

30
CodeBug

Meldè anche un ottimo strumento per confrontare due directory:

meld dir1/ dir2/

Meld ha molte opzioni per confrontare file o directory. Se due file differiscono, è facile inserire la modalità di confronto dei file e vedere le differenze esatte.

15
Alexander

Channel billetti 'billings' (di freenode/# centos fame) ha condiviso il suo metodo con me:

diff -Naur dir1/ dir2

Includere la barra finale della directory finale non ha importanza.

Inoltre, sembra che l'opzione -u non sia disponibile su alcune vecchie versioni/server di diff.

La differenza in diff:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
9
todd_dsm

Diffoscope è un grande strumento per la directory directory diff.

Mi piace soprattutto che possa diff in files:

Scaccherà ricorsivamente archivi di molti tipi e trasformerà vari formati binari in una più leggibile forma umana per confrontarli. Può confrontare due tarball, immagini ISO o PDF altrettanto facilmente.

Non ti dirà solo quali file differiscono, ma anche come differiscono.

3
nh2

Per trovare diff usa questo comando:

diff -qr dir1/ dir2/

-r differirà anche tutte le sottodirectory -q indica diff per segnalare solo quando i file differiscono.

diff  --brief dir1/ dir2/

--brief mostrerà i file che esistono nella directory.

O altro

possiamo usare Meld che mostrerà in finestra grafica è facile trovare la differenza.

meld  dir1/ dir2/
2
Javeed Shakeel

Puoi anche usare Rsync e find. Per find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Ma i file con gli stessi nomi e nelle stesse sottocartelle, ma con contenuti diversi, non verranno mostrati negli elenchi.

Se sei un fan della GUI, puoi controllare Meld that @Alexander menzionato. Funziona bene sia in Windows che in Linux.

0
Fábio