Wie kann ich unter Linux leicht bestätigen, dass zwei separate Verzeichnisse genau den gleichen Inhalt haben?

8

CentOS 5.x.

Mq Frage schien ähnlich diesen , aber ich war nicht sicher , ...

Ich habe zwei Server (vollständig voneinander isoliert), jeder mit einem Verzeichnis und Unterverzeichnissen, die genau den gleichen Inhalt haben sollten.

Das Verzeichnislayout könnte beispielsweise so aussehen:

SERVER A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

SERVER B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Idealerweise möchte ich eine Möglichkeit haben, eine rekursive Prüfung durchzuführen und etwas bestätigen zu lassen, dass alles übereinstimmt.

Ich möchte auch die Verwendung von Tools von Drittanbietern vermeiden.

Irgendwelche Ideen?

Mike B.
quelle
Möchten Sie nur die beiden Verzeichnisse vergleichen oder tatsächlich eines zu einem Duplikat des anderen machen?
Scott Pack
@ ScottPack Gute Frage. Ich möchte vergleichen, aber KEINE Änderungen vornehmen. Etwas anderes kümmert sich um die Replikation der Verzeichnisse. Ich möchte nur sicherstellen, dass es seinen Job macht.
Mike B
1
Sie haben diese Frage bereits markiert rsync? Also ... ähm, verwenden rsync(mit -nOption)?
Fälscher
@faker Ich dachte, rsync könnte die Option sein, war mir aber nicht sicher, ob es etwas Besseres, Einfacheres oder Spezifischeres für diesen Anwendungsfall gibt. Ich muss wissen, dass Dateiname, Datum, Größe und relativer Speicherort übereinstimmen.
Mike B
Beachten Sie, dass rsync den Dateiinhalt nicht überprüft, wenn Zeit und Größe übereinstimmen. Weitere Informationen finden Sie in der Option --checksum, wenn Sie sich Sorgen machen.
Eintopf

Antworten:

9

Eine gute Möglichkeit besteht darin, md5sums für jede Datei im Baum zu verwenden:

Führen Sie dies auf Server1 aus:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Führen Sie dies auf Server2 aus

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Dann vergleichen Sie einfach die beiden Dateien (mit diff) oder was auch immer Sie möchten.

Entspricht das dem, wonach Sie suchen?

Natürlich können Sie SSH verwenden, um den Befehl nur remote auszuführen, wenn Sie möchten.

Camden S.
quelle
Danke Camden. Ja, ich denke das ist was ich gesucht habe. Ich werde es testen und sehen, ob es funktioniert.
Mike B
2
Oder md5sum die md5sums
dmourati
Ausgezeichnet - richtig, wenn Sie nicht wissen möchten, welche Dateien sich ändern, können Sie einfach die resultierenden Dateien md5summen und diese beiden Summen vergleichen.
Camden S.
Sie wissen das wahrscheinlich auch schon, aber um diesen Befehl remote über SSH auszuführen, tun Sie es einfachssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.
1
MikeB: Wenn Sie eine rekursive lange Liste ausführen und diese an md5sum übergeben, erhalten Sie eine md5sum der Verzeichnisliste, die den Inhalt von Dateien ausschließt. Wenn die Inode-Größen auf Dateisystemen an beiden Enden unterschiedlich wären, könnte dies auch zu einem Unterschied bei den Dateigrößen führen. Erstellen einer MD5-Summe für den Inhalt, wie ursprünglich von @CamdenS vorgeschlagen. ist besser.
Nearora
7

Wenn Sie sich nicht unbedingt darum kümmern, was sich geändert hat, sondern nur, dass sich etwas geändert hat, ist rsync immer noch sehr gut dafür. Versuchen Sie, diesen Befehl auszuführen, und werfen Sie einen Blick auf die Ausgabe, vorausgesetzt, dies wird von 'servera' ausgeführt.

rsync -avcn /opt/foo/ serverb:/opt/foo

Die resultierende Liste enthält die Dateien, die geändert worden wären, wenn Sie den Synchronisierungsprozess tatsächlich ausgeführt hätten. Beachten Sie, dass die Dateien in der Liste angezeigt werden, auch wenn sich nur der Zeitstempel geändert hat, der Inhalt jedoch gleich geblieben ist. Da wir das -nFlag hinzugefügt haben , werden tatsächlich keine Aktionen ausgeführt, sondern nur gemeldet.

Scott Pack
quelle
Vielen Dank. Was ist, wenn die beiden Boxen vollständig voneinander isoliert sind? Wie kann ich die Ausgabe zum Vergleichen verwenden?
Mike B
rsync unterstützt nicht sowohl Quelle als auch Ziel, um remote zu sein, daher muss er es von einem seiner Server ausführen
Fälscher
@faker: Muss zugeben, das habe ich noch nie versucht, gut zu wissen. Wie Sie sagen, ist es jedoch leicht genug, dies zu erklären.
Scott Pack
+1. Clevere Verwendung von rsync. Um jedoch völlig korrekt zu sein, müssen Sie das rsyncin beide Richtungen ausführen . Das heißt, Sie müssen Folgendes hinzufügen:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven Montag,
5

Während Sie ein schnelles Skript zusammenhacken könnten, das einzelne MD5-Hashes für einzelne Dateien in einem Verzeichnis berechnet, wäre es besser, ein Tool namens zu verwenden, md5deepdas die Hashes aller Dateien in einem Verzeichnis rekursiv berechnet und dann ausgibt sie in eine Datei. Es kann dann in einem anderen Verzeichnis verwendet werden, wobei die erste Hash-Datei als Eingabe verwendet wird und Sie eine Liste der Dateien erhalten, die sich zwischen den beiden Verzeichnissen unterscheiden.

Nehmen Sie also Ihr Beispiel und folgen Sie diesem Prozess:

  1. Berechnen Sie Hashes des erforderlichen Verzeichnisses auf Server A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Kopieren Sie die Datei file_hashes.txtzum Vergleich auf Server B.

  3. Berechnen Sie die Hashes des erforderlichen Verzeichnisses auf Server B, verwenden Sie jedoch die Datei-Hashes von Server A als Eingabedatei, indem Sie das -xFlag verwenden, um nur Dateien anzuzeigen, die sich unterscheiden:

    md5deep -x file_hashes.txt -r /opt/foo/

Die md5deep-Tools sind Teil des Paketverwaltungssystems der meisten Distributionen, und das Tolle ist, dass sie eine Reihe verschiedener Hashing-Algorithmen unterstützen, nicht nur MD5. Wenn Sie also in Bezug auf Kollisionen paranoid sind, stehen Ihnen eine Reihe von Alternativen zur Verfügung. Die folgenden Tools sind Teil von md5deep und bieten jeweils einen alternativen Hashing-Algorithmus:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests
Richard Keller
quelle
0

Ich habe eine ähnliche Technik wie @ scott-pack verwendet. Dies zeigt, dass Sie sich in beide Richtungen unterscheiden können. Alles, was mit "Löschen" beginnt, ist eine Datei, die sich auf dem Remote-Server befindet, nicht jedoch auf dem lokalen Server. Jedes Verzeichnis, das ohne Dateiinhalt aufgeführt ist, hat keine Änderungen. Jede aufgelistete Datei ist eine Datei, die entweder nicht auf dem Remote-Server vorhanden ist oder deren lokale Version "neuer" ist.

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
David Baucum
quelle