Vergleichen Sie umfangreiche Verzeichnisse mit dem Fortschrittsbericht

13

Ich habe gerade 2.000.000 Dateien (3 TB) von einem RAID auf ein anderes synchronisiert.

Ich möchte sicherstellen, dass meine Daten intakt sind.

rsync -c dauert sehr lange.

diff zeigt mir nicht, was es tut.

Gibt es eine Alternative, die (a) schneller ist und (b) mir Fortschritte beim Vergleichen zeigt?

(Ich bin auf dem Mac und brew search diffgebe mir apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... würde einer von diesen den Job machen?)

Dan
quelle
Ich bin auch verwirrt, warum rsyncdie Daten mit etwa 150 MB / s kopiert wurden, aber diffnur mit 60 MB / s verglichen wurden ...?
Dan
Das Kopieren mit rsyncist schneller. B / C verwendet rsyncstandardmäßig keine Prüfsummen zum Vergleichen von Dateien. Es werden Informationen zu Größe und Datum angezeigt. Wenn Sie rsync -calle Dateien verwenden, müssen deren Prüfsummen berechnet werden, was eine lästige Aufgabe ist, weshalb dies nicht die Standardaufgabe ist.
SLM
Ja, aber diff kopiert nicht ... es liest nur beide Dateien; Während rsync zum Kopieren jedes Byte lesen und dann schreiben muss. Dies war ein Rsync von Grund auf neu, also wurde jede Datei kopiert.
Dan

Antworten:

6

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.

D McKeon
quelle
Gibt es eine Möglichkeit, es zu mvjeder Datei zu bringen, die es in einem "überprüften" Ordner im Stammverzeichnis des Laufwerks findet, wobei der vollständige Pfad erhalten bleibt? Wenn z. B. /disk1/a/b/c/file1identisch mit ist /disk2/a/b/c/file1, verschieben Sie es nach /disk1/verified/a/b/c/file1. Dann könnte ich nur die schlecht kopierten Dateien haben. (Bisher sind viele Dateien über 10 GB nicht überprüft, was beängstigend ist.)
Dan
Möglicherweise möchten Sie diese Option ausprobieren: --speed-large-files
D McKeon
Was macht das genau?
Dan
Wenn ich laufe rsync -vin- führt das einen byteweisen oder einen Prüfsummenvergleich durch? Ich dachte, Rsync nur verglichen Größe / Datum, wenn Sie hinzufügen -c. Und von dem, was ich gelesen habe, speed large filesscheint das nur bei nicht-binären Dateien einen Unterschied zu machen ... oder irre ich mich?
Dan
diffgibt mir Ergebnisse in Form von "Files __ and ___ differ"... und ich führe das durch sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//", um zu versuchen, ein Skript zum erneuten Kopieren der fehlerhaften Dateien zu generieren. Die Ausgabe von diff ist jedoch nicht zitiert und funktioniert daher nicht. Kann ich es mir zitierte Pfade geben lassen?
Dan
4

Hier ist ein diffFortschrittsbericht basierend auf der Anzahl der Dateien:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Sie benötigen pv (pipe viewer): http://www.ivarch.com/programs/pv.shtml

Erläuterung:

  • diff -r Verzeichnis und Unterverzeichnisse rekursiv vergleichen.
  • diff -qNur Dateinamen von Dateien unterscheiden sich. drucken Sie keine tatsächlichen Unterschiede aus.
  • diff -sDrucken Sie auch Dateinamen von Dateien aus, die sich nicht unterscheiden. Dies ist wichtig für die Fortschrittsinformation.
  • pv -l berichte den Fortschritt basierend auf der Zeilenzahl.
  • pv -s count Geschätzte Zeit bis zur Fertigstellung basierend auf der Anzahl.
  • Die Weiterleitung zu logfileist für hübsche Ausgabe. Andernfalls wird die Ausgabe von diffmit der Statuszeile von gemischt pv.

Verwenden Sie den folgenden Befehl, um die Anzahl der Dateien zu ermitteln:

find dir1 -type f | wc -l

Filtern Sie die Protokolldatei nach Dateien, die unterschiedlich sind:

grep -v "^Files .* identical$" logfile

Diese Variante druckt Dateien, die sich in Echtzeit unterscheiden, und protokolliert gleichzeitig alles in logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Alternativ können Sie nur Dateien protokollieren, die unterschiedlich sind:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Hinweis: Die obigen Befehle geben den Fortschritt basierend auf der Anzahl der Dateien an. Dies funktioniert am besten, wenn es viele kleinere Dateien gibt. Wenn Sie ein paar große Dateien haben, werden Sie nicht viel Spaß damit haben.

Leider kenne ich keine einfache Möglichkeit, den Fortschritt anhand der verglichenen Bytes zu melden.


Wenn Sie Ihre Ruhe finden, indem Sie nur die Metadaten (und nicht den tatsächlichen Inhalt der Dateien) vergleichen, können Sie rsync verwenden. Dies wird erheblich schneller sein.

Für mehr Details:

Lesmana
quelle
0

Ich würde eine Art Hash-Anwendung verwenden, um die Datenintegrität zu überprüfen. Ich weiß, dass viele Dienstprogramme zur Suche nach doppelten Dateien Hashes verwenden, um doppelte oder nicht doppelte Dateien zu identifizieren. Scheint mir, dass dies eine Untersuchung ist, die sich lohnen könnte.

OT Coder
quelle
0

Sie können dazu rdiff-backup verwenden . Wenn Sie es auf beiden Servern installieren, werden die Prüfsummen intelligent verglichen und die noch nicht vorhandenen Daten synchronisiert.

Timo
quelle