modifica per correzione e chiarezza delle opzioni - Ho dimenticato '--brief'
diff -rs --brief "$dir1" "$dir2"
-r, --recursive recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief report only when files differ
--speed-large-files assume large files and many scattered small changes
e aggiungi altre opzioni a piacere, a seconda di cosa stai confrontando:
-i, --ignore-case ignore case differences in file contents
-b, --ignore-space-change ignore changes in the amount of white space
-B, --ignore-blank-lines ignore changes whose lines are all blank
--strip-trailing-cr strip trailing carriage return on input
--ignore-file-name-case ignore case when comparing file names
diff -rs leggerà tutti i byte dell'originale e li copierà e riporterà i file uguali.
Il formato di output diff è definito da POSIX, quindi è abbastanza portatile. Potresti voler aggiungere qualcosa come:
| tee diff-out.1 | grep -v -Ee 'I file. * e. * sono identici'
Potresti usare chksums o hash, ma poi devi mantenerli sincronizzati con gli alberi dei file, quindi tornerai comunque a leggere ogni byte di ogni file.
EDIT - troppo tempo per essere un commento, in risposta a:
i file superiori a 10 GB non stanno verificando
Puoi provare questa opzione diff: --speed-large-files
È possibile che il diff che stai usando non stia gestendo bene file molto grandi (più grandi della memoria di sistema, per esempio), e quindi riferendo differenze tra file che sono effettivamente gli stessi.
Avevo pensato che ci fosse un'opzione -h o un 'bdiff' che funzionasse meglio su file di grandi dimensioni, ma non riesco a trovarne uno in Fedora. Credo che le opzioni --speed-large-files siano il successore di un'opzione '-h' "confronto senza cuore".
Un approccio diverso sarebbe quello di ripetere il comando rsync che hai usato, con '-vin' (verbose, itemize, no_run). Ciò segnalerebbe eventuali differenze rilevate da rsync - e non dovrebbero essercene.
Per spostare alcuni file, stai guardando uno script simile al seguente:
if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv "$dir2/$path" "$target"
fi
ma non consiglio di farlo. La domanda di fondo è "come posso essere sicuro che rsync abbia copiato correttamente una gerarchia di file?" e se puoi dimostrare a te stesso che rsync sta funzionando bene, con diff o qualche altro strumento, allora puoi semplicemente fare affidamento su rsync, piuttosto che aggirarlo.
rsync -vin comparerà in base a qualsiasi altra opzione tu gli dia. Ho pensato che il checksum fosse predefinito, ma hai ragione, -c o --checksum è richiesto per questo.
L'utilità diff è davvero pensata per file di righe di testo, ma dovrebbe riportare sottotitoli 'identici' per file binari.
Il --brief dovrebbe sopprimere qualsiasi output del contenuto del file - le mie scuse per averlo ignorato in precedenza - è stato semi-sepolto in una brutta sceneggiatura.