Un buon modo per fare questo confronto è usare find
con md5sum
, quindi a diff
.
Esempio
Usa trova per elencare tutti i file nella directory, quindi calcola l'hash md5 per ogni file e esegui il pipe in ordine di nome file in un file:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
Esegui la stessa procedura in un'altra directory:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Quindi confrontare il risultato due file con diff
:
diff -u dir1.txt dir2.txt
O come singolo comando usando la sostituzione del processo:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Se vuoi vedere solo le modifiche:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
Il comando cut stampa solo l'hash (primo campo) da confrontare con diff. Altrimenti diff stamperà ogni riga poiché i percorsi della directory differiscono anche quando l'hash è lo stesso.
Ma non saprai quale file è cambiato ...
Per questo, puoi provare qualcosa del genere
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
Questa strategia è molto utile quando le due directory da confrontare non sono nella stessa macchina ed è necessario assicurarsi che i file siano uguali in entrambe le directory.
Un altro buon modo per fare il lavoro è usare il diff
comando di Git (può causare problemi quando i file hanno autorizzazioni diverse -> ogni file è elencato nell'output quindi):
git diff --no-index dir1/ dir2/
bash --version
?