Korrektur & Optionsklarheit - Ich habe '--brief' vergessen
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
und fügen Sie je nach dem, was Sie vergleichen, weitere Geschmacksoptionen hinzu:
-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 liest jedes Byte des Originals und der Kopie und gibt die gleichen Dateien aus.
Das Diff-Ausgabeformat wird von POSIX definiert und ist daher ziemlich portabel. Möglicherweise möchten Sie Folgendes hinzufügen:
| tee diff-out.1 | grep -v -Ee 'Dateien. * und. * sind identisch'
Sie könnten Chksums oder Hashes verwenden, aber dann müssen Sie sie mit den Dateibäumen synchronisieren, damit Sie ohnehin wieder jedes Byte jeder Datei lesen können.
BEARBEITEN - zu lang, um ein Kommentar zu sein, als Antwort auf:
Dateien über 10 GB werden nicht überprüft
Möglicherweise möchten Sie diese Diff-Option ausprobieren: --speed-large-files
Es ist möglich, dass das von Ihnen verwendete Diff mit sehr großen Dateien (z. B. größer als der Systemspeicher) nicht gut zurechtkommt und daher Unterschiede zwischen Dateien meldet, die tatsächlich gleich sind.
Ich hatte geglaubt, es gäbe eine -h-Option oder einen 'bdiff', der bei großen Dateien besser funktioniert, aber ich kann keinen in Fedora finden. Ich glaube, dass die --speed-large-files-Optionen ein Nachfolger einer '-h'-Option zum "halbherzigen Vergleichen" sind.
Ein anderer Ansatz wäre, den von Ihnen verwendeten Befehl rsync mit '-vin' zu wiederholen (verbose, itemize, no_run). Dies würde alle Unterschiede melden, die rsync findet - und es sollte keine geben.
Um einige Dateien zu verschieben, betrachten Sie ein Skript wie:
if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv "$dir2/$path" "$target"
fi
aber ich empfehle das nicht. Die zugrunde liegende Frage lautet: "Wie kann ich sicher sein, dass rsync eine Dateihierarchie korrekt kopiert hat?" und wenn Sie sich selbst beweisen können, dass rsync mit diff oder einem anderen Tool gut funktioniert, können Sie sich einfach auf rsync verlassen, anstatt es zu umgehen.
rsync -vin vergleicht basierend auf den anderen von Ihnen angegebenen Optionen. Ich dachte, es wäre standardmäßig die Prüfsumme, aber Sie haben Recht, dafür ist -c oder --checksum erforderlich.
Das Dienstprogramm diff ist eigentlich für Dateien mit Textzeilen gedacht, sollte jedoch für Binärdateien "identische" Unter-Werte angeben.
Der --brief sollte jegliche Ausgabe von Dateiinhalten unterdrücken - ich entschuldige mich dafür, dass ich ihn früher übersehen habe - er wurde in einem hässlichen Skript halb vergraben.