File diff presenti in due diverse directory


303

Ho due directory con lo stesso elenco di file. Ho bisogno di confrontare tutti i file presenti in entrambe le directory usando il diffcomando. Esiste una semplice opzione da riga di comando per farlo o devo scrivere uno script di shell per ottenere l'elenco dei file e quindi scorrere attraverso di essi?

Risposte:


422

È possibile utilizzare il diffcomando per quello:

diff -bur folder1/ folder2/

Questo produrrà un diff ricorsivo che ignora gli spazi, con un contesto unificato:

  • b flag significa ignorare gli spazi bianchi
  • u flag indica un contesto unificato (3 righe prima e dopo)
  • r flag significa ricorsivo

9
È possibile accedere al diffcomando scaricando le utility GNU per Win32 .
Laurent Etiemble,

7
Ho anche scoperto che l'opzione --brief è utile; ottieni un elenco di file modificati e puoi elaborarli separatamente
Dariusz,

27
Per gli altri che si chiedono, -bignora le modifiche agli spazi bianchi e -ufornisce 3 righe di buffer.
Rattray,

28
È più facile ricordare questo comando se si utilizza rub anziché fresadiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
Immagino che -bursarebbe facile ricordare se vivessi in un clima freddo.
AlanH,

126

Se sei interessato solo a vedere i file che differiscono, puoi utilizzare:

diff -qr dir_one dir_two | sort

L'opzione "q" mostrerà solo i file che differiscono ma non il contenuto che differisce, e "ordina" organizzerà l'output in ordine alfabetico.


1
È grande! Funziona anche in modo efficiente, vale a dire se un'intera sottodirectory esiste solo in una delle directory, smette di ricorrere in essa e riporta solo la sottodirectory stessa (senza i contenuti successivi). molto bella!!
Qualcosa del

Questo è davvero un buon primo passo: vediamo che cosa, se non altro, non differiscono, e poi fare una dettagliata diffsu ogni coppia di file differenti. L'approccio di uno sarebbe molto diverso se solo uno o due file differissero rispetto a dozzine di file diversi. Potrei perdersi nell'output di diffdozzine di file contemporaneamente!
jvriesem,

Inoltre, può includere -x PATTERNnel comando per escludere determinate sottodirectory. Ad esempio, diff -qr repo1 repo2 -x ".git"confronteranno due directory (repo1 e repo2) ma escluderanno i file nella cartella .git delle rispettive directory.
ViFI,

20

Diff ha un'opzione -rche vuole fare proprio questo.

diff -r dir1 dir2


11

diffnon solo può confrontare due file, ma, usando l' -ropzione, può percorrere interi alberi di directory, controllando ricorsivamente le differenze tra sottodirectory e file che si verificano in punti comparabili in ciascun albero.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

Se è GNU diff, dovresti essere in grado di puntarlo alle due directory e usare l'opzione -r.

Altrimenti, prova a usare

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB Come sottolineato da Dennis nella sezione commenti, in realtà non è necessario eseguire la sostituzione del comando su ls. Lo sto facendo da così tanto tempo che sto praticamente facendo questo con il pilota automatico e sostituendo il comando di cui ho bisogno per ottenere il mio elenco di file per il confronto.

Ho anche dimenticato di aggiungere che faccio '\ ls' per disabilitare temporaneamente il mio alias di ls su GNU ls in modo da perdere le informazioni sulla formattazione del colore dall'elenco restituito da GNU ls.


2
Non è necessario utilizzare ls:for i in ./dir1/*
In pausa fino a nuovo avviso.

1
@Dennis, scorciatoia funky. +1. Sono così abituato a fare la sostituzione dei comandi anche se è automatico e utilizzo solo il comando che mi serve, ad esempio a volte sto usando find. L'uso di ls mi permette anche di giocare con l'elenco dir più, ad esempio in base al tempo inverso anziché alla sequenza predefinita.
Rob Wells,

0

Ecco uno script per mostrare le differenze tra i file in due cartelle. Funziona in modo ricorsivo. Cambia dir1 e dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

Se in particolare non si desidera confrontare i contenuti dei file e verificare solo quali non sono presenti in entrambe le directory, è possibile confrontare gli elenchi di file, generati da un altro comando.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'indica finddi non aggiungere prefissi ai percorsi di output con la directory principale.

Ho anche aggiunto sortper assicurarsi che l'ordine dei file sarà lo stesso in entrambe le chiamate di find.

Alla grepfine rimuove le informazioni su linee di input identiche.


-4

Prova questo:

diff -rq /path/to/folder1 /path/to/folder2      

2
Questo duplica una risposta esistente e non aggiunge nuovi contenuti. Per favore, non pubblicare una risposta a meno che tu non abbia effettivamente qualcosa di nuovo da contribuire.
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.