Überprüfen eines großen Verzeichnisses nach dem Kopieren von einer Festplatte auf eine andere

Überprüfen eines großen Verzeichnisses nach dem Kopieren von einer Festplatte auf eine andere

Ich habe einen Heimdateiserver, auf dem ich Ubuntu verwende.

Vor Kurzem war eines meiner Laufwerke voll, also habe ich ein anderes geholt und es dort hineingeworfen.

Ich habe einen sehr großen Ordner, das Verzeichnis ist etwa 1,7 T groß und enthält eine ordentliche Menge an Dateien.

ich benutzteGCPum die Dateien vom alten Laufwerk auf das neue zu KOPIEREN, und es scheint problemlos funktioniert zu haben.

Ich möchte nun das neue Verzeichnis auf dem neuen Laufwerk mit dem Originalverzeichnis auf dem alten Laufwerk vergleichen, bevor ich die Daten vom alten Laufwerk lösche, um Speicherplatz freizugeben. Ich verstehe, dass ich dazu eine CRC-Prüfung durchführen kann.

Wie kann ich das konkret tun?

Antwort1

Ich würde einfach den diffBefehl verwenden:

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/

Dies liest und vergleicht jede Datei in den Verzeichnisbäumen und meldet etwaige Unterschiede. Das -rFlag vergleicht die Verzeichnisse rekursiv, während das -qFlag nur eine Meldung auf dem Bildschirm ausgibt, wenn sich die Dateien unterscheiden – im Gegensatz zum Ausdrucken der tatsächlichen Unterschiede (wie es bei Textdateien der Fall ist). Das --no-dereferenceFlag kann nützlich sein, wenn es symbolische Links gibt, die sich unterscheiden, z. B. in einem Verzeichnis ein symbolischer Link und im entsprechenden Verzeichnis eine Kopie der Datei, auf die verwiesen wurde.

Wenn der diffBefehl drucktkeine Leistung, das heißt, die Verzeichnisbäume sind tatsächlich identisch. Sie können ausführen, echo $?um zu überprüfen, ob der Beendigungsstatus lautet 0, was darauf hinweist, dass beide Dateisätze identisch sind.

Ich glaube nicht, dass das Berechnen von CRCs oder Prüfsummen in diesem Fall besonders nützlich ist. Es wäre sinnvoller, wenn sich die beiden Dateisätze auf unterschiedlichen Systemen befänden und jedes System die Prüfsummen für seinen eigenen Dateisatz berechnen könnte, sodass nur die Prüfsummen über das Netzwerk gesendet werden müssten. Ein weiterer häufiger Grund für das Berechnen von Prüfsummen ist, eine Kopie der Prüfsummen für die zukünftige Verwendung aufzubewahren.

Antwort2

rsyncwird oft zum Kopieren von Dateien anstelle von verwendet gcp, kann aber auch zum Überprüfen einer Kopie verwendet werden, egal wie sie erstellt wurde. Führen Sie dazu einfach

rsync -niaHc /origfolder/ /copyfolder

Achten Sie darauf, dass der erste Ordnername (die Quelle) mit einem endet /. Die Optionen sind

  • -nnicht kopieren (keine Änderungen vornehmen)
  • -iIdentifizieren Sie die Unterschiede
  • -a-nBewahren Sie Berechtigungen, Eigentümerschaften, symbolische Links usw. auf (vergleichen Sie, da wir sie haben ) und durchsuchen Sie Verzeichnisse nach unten.
  • -HHardlinks beibehalten
  • -cPrüfsummen vergleichen

Die Ausgabe zeigt einen Code, der die Unterschiede für jede Datei oder jedes Verzeichnis detailliert beschreibt, die bzw. das sich unterscheidet. Es erfolgt keine Ausgabe, wenn sie gleich sind. Der Code enthält Spalten, YXcstpoguaxin denen jedes Zeichen ein Punkt ist ., wenn dieser Aspekt des Vergleichs in Ordnung ist, oder ein Buchstabe:

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ

Zum Beispiel,

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied

Weitere Einzelheiten finden Sie weiter man rsyncunten . Wenn Sie Unterschiede in der 3. oder 4. Spalte haben, liegt eine schwerwiegende Datenbeschädigung vor. Andere Flags wie unterschiedliche Berechtigungen, Besitzer oder Zeitstempel sind für Sie möglicherweise weniger wichtig. Wenn alle Dateien als „fehlend“ markiert sind, haben Sie wahrscheinlich nicht die richtigen Verzeichnisse zum Vergleichen angegeben. Wenn Sie sicher sind, werden die Unterschiede durch Ausführen von rsync ohne das Flag „behoben“.--itemize-changescs-n

Antwort3

Ich hatte die gleiche Frage und ich habeAnthonys Antwort, mit einer kleinen Wendung.

Die direkte Anwendung seiner Antwort schlägt im Falle eines Hardwarefehlers (z. B. Eingabe-/Ausgabefehlers) fehl, der zum Beenden von Diff führt.

Ich habe seine Antwort zusammengestellt, zusammen mitdiese Antwort, und fassen Sie alles wie folgt zusammen:

find /path/to/original -type f -exec bash -c 'diff -rq --no-dereference "$@" "/path/to/destination/$(sed -r "s/^.*(<first-common-ancestor>.*)$/\1/g" <<<"$@")"' bash {} \;
  • Ersetzen Sie es /path/to/originaldurch den Pfad des ursprünglichen Verzeichnisses, das Sie kopiert haben.
  • Ersetzen Sie es /path/to/destinationdurch den Pfad des Zielverzeichnisses, in das Sie kopiert haben.
  • Ersetzen Sie <first-common-ancestor>durch das gemeinsame Vorgängerverzeichnis beider. Beispiel: Sie kopieren von /media/foo/barnach /media/test/dst/, sodass dstnach Abschluss des Kopiervorgangs das Verzeichnis vorhanden ist bar. Der erste gemeinsame Vorgänger ist barhier, da alle Dateien darunter bardenselben relativen Pfad haben.

Einige Notizen:

  • Die Teile bash -cund bash {}dienen zur sicheren Ersetzung von Dateinamen, um auf Nummer sicher zu gehen und bei möglichen Angriffen (wie etwa einer Rechteerhöhung) keinen Schaden zu nehmen.
  • Der sedTeil besteht darin, den absoluten Pfad der gefundenen Datei zu entfernen und nur den relativen Pfad zu verwenden (das ist nicht dasselbe wie die Verwendung von execdir). Wenn Sie nicht sicher sind, wie nützlich das ist, versuchen Sie, es zu entfernen und überprüfen Sie die Fehlermeldungen :)
  • Die Variable soll <<<als Zeichenfolge gelesen werden, anstatt sie als Pfad zu einer zu lesenden Datei zu lesen.

verwandte Informationen