Gibt es MD5 (oder ähnliches) zu einem Ordner? Wie überprüfe ich, ob zwei Ordner gleich sind?

10

Ich möchte eine md5sum(oder eine ähnliche Berechnung) eines Ordners finden, ohne ihn in ein Archiv zu komprimieren.

Zum Beispiel, wenn MyFolderwir in dem Ordner die Dateien 1.txthaben 2.txtund 3.txtenthalten:


1.txt

Der Text in 1.txt

2.txt

Der Text in 2.txt

3.txt

Der Text in 3.txt


Wie kann ich die Berechnung md5sumdieser ganzen MyFolder? Gibt es einen Weg? Ich möchte dies verwenden, um zu überprüfen, ob zwei Ordner den gleichen Inhalt haben.

Dies kann verwendet werden, um zu überprüfen, ob zwei CDs oder Ordner gleich sind. Ich hätte gerne einen einfachen Weg, es zu tun.

GarouDan
quelle

Antworten:

15

Das md5deep Tool wurde genau für diesen Zweck entwickelt. Viele Linux-Distributionen bieten es in Paketform an.

David Schwartz
quelle
1
Danke! Es hat gut funktioniert für mich. An andere Benutzer mit dem gleichen Problem, die dies mögen: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Vielen Dank.
GarouDan
@ GarouDan. Der angezeigte Befehl folgt symbolischen Links. Sie können die -oOption verwenden, um Dateitypen zu behandeln.
Peter.O
Oh thx ... weiß das nicht ... wirklich hilfreich. Ich werde mich erinnern!
GarouDan
4

Wenn Sie es nicht archivieren möchten, können Sie vielleicht so etwas tun

diff <(find folder1) <(find folder2)

Möglicherweise müssen Sie die findBefehle anpassen , um genauer zu sein.

BEARBEITEN Sie können -execIhrem Suchaufruf hinzufügen , um den Inhalt von Dateien zu vergleichen. Ähnliches:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Denken Sie daran, dass Sie dies möglicherweise anpassen möchten.

Rahmu
quelle
Das ist ein interessanter Punkt. Hier werden alle Dateien jedes Ordners aufgelistet ... aber wenn ich wirklich viele Archive habe ... wie kann ich überprüfen, ob in jedem Ordner dieselben Dateien (mit den Daten - möglicherweise mit einem md5sum-Tool) vorhanden sind?
GarouDan
1
Führen Sie dann einen Diff der MD5SUM-Ausgabe jeder Datei durch. Sie müssen nur die Befehle find, md5sum und diff unterschiedlich aneinanderreihen.
Sybreon
Danke auch über deine Ideen, cya ... Ich werde interessante Dinge mit diesen Befehlen ausprobieren, nachdem ... danke.
GarouDan
3

Eine Möglichkeit zum Testen könnte darin bestehen, eine md5sum basierend auf der Verkettung aller Dateien im Ordner und seinen Unterordnern zu generieren. Beachten Sie, dass dies auch erfordert, dass die Dateien dieselben Namen haben (da sie in derselben Sortierreihenfolge vorliegen müssen). Der folgende Code sollte funktionieren:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Wenn Sie sich wirklich für die Dateinamen usw. interessieren, können Sie eine Schleife verwenden, um zu vergleichen, was sich in ${_files_in_old_dir}und befindet ${_files_in_new_dir}. Dies sollte in den meisten Fällen funktionieren (es überprüft zumindest die Anzahl der Dateien im Verzeichnis und seinen Unterverzeichnissen).

Chris Down
quelle
Dies ist ein schönes Skript ... danke @Chris. Aber es gibt ein Problem ... mit cat stürzen Unterordner mit Fehlern ab ... Haben Sie eine Idee, es zu lösen? Vielen Dank.
GarouDan
Es funktioniert gut für mich. Stellen Sie sicher, dass Ihre Shell unterstützt globstar. Was ist der Fehler?
Chris Down
1
Es "funktioniert" (+1) ... aber Globstar in Bash 4 folgt Verzeichnissymlinks , aber das ist nur dann ein Problem, wenn eines der Verzeichnisse einen Symlink enthält.
Peter.O
@fered Guter Anruf, fügte ich in einem Test hinzu.
Chris Down
0

Ich habe festgestellt, dass der ursprüngliche Beitrag ziemlich alt ist. Ich denke jedoch, dass diese Informationen für diejenigen, die nach einer Lösung suchen, um zu überprüfen, ob die Dateien korrekt kopiert wurden, immer noch wertvoll sein können. Rsync ist möglicherweise die beste Methode zum Kopieren von Daten. Die in diesem Thread angegebenen Antworten sind gut. Für diejenigen, die noch keine Erfahrung mit Linux haben, werde ich versuchen, eine detailliertere Erklärung zu geben.

Szenario: Sie haben gerade Daten von einer Festplatte auf eine andere kopiert, mit vielen Unterverzeichnissen und Dateien. Sie möchten überprüfen, ob alle Daten korrekt kopiert wurden.

Überprüfen Sie zunächst, ob md5deep installiert ist, indem Sie den Befehl ausgeben md5deep -v.

Wenn Sie die Meldung "Befehl nicht gefunden" erhalten, installieren Sie md5deep by apt-get install md5deep.

Es wird davon ausgegangen, dass Sie nur mit regulären Dateien arbeiten möchten. Wenn Sie sich mit anderen Dateitypen befassen möchten, lesen Sie das Flag -o im Handbuch md5deep. ( man md5deep)

Jetzt können Sie loslegen, und wir gehen davon aus, dass Sie Dateien von /mnt/orginalnach kopiert /mnt/backuphaben. Ersetzen Sie diese durch die von Ihnen verwendeten Verzeichnisse.

Wechseln Sie zuerst in das Quellverzeichnis. Dies ist die Originalquelle für die Dateien, die Sie kopiert oder gesichert haben:

cd /mnt/orginal

Machen Sie dann eine Prüfsumme für jede Datei:

md5deep -rel -o f . >> /tmp/checksums.md5

Dieser Befehl erklärte:

-r aktiviert den rekursiven Modus

-e Zeigt die Fortschrittsanzeige an

-l aktiviert relative Dateipfade.

-o f Arbeiten Sie nur mit normalen Dateien (blockieren Sie keine Geräte, Named Pipes usw.)

. Weist md5deep an, im aktuellen Verzeichnis zu starten.

>> /tmp/checksums.md5Weist md5deep an, alle Ausgaben an umzuleiten /tmp/checksums.md5.

Hinweis: Wenn Sie Inhalte in früheren Versionen von überschreiben möchten /tmp/checksums.md5, verwenden Sie >und nicht>>

Beachten Sie, dass dieser Befehl abhängig von der Geschwindigkeit und der Größe der Daten eine Weile dauern kann. Sie könnten mit nice und / oder ionice experimentieren, um die Leistung von md5deep zu steigern, aber das liegt außerhalb des Rahmens dieser Antwort.

Wenn die Erstellung der Prüfsummen abgeschlossen ist, haben Sie jetzt eine Datei mit Einträgen ähnlich den folgenden:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/4 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

Die erste Spalte ist die md5-Prüfsumme und die zweite Spalte ist der relative Pfad zu der Datei, zu der die Prüfsumme gehört.

Wenn Sie sehen möchten, wie viele Dateien in der Prüfsummendatei vorhanden sind, geben Sie den folgenden Befehl ein:

wc /tmp/checksums.md5 -l

Nun möchten Sie überprüfen, ob die kopierten Daten korrekt sind:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

Der einzige Unterschied zu dem Zeitpunkt, an dem wir die Prüfsummen erstellt haben, ist -X, das den aktuellen Hash einer Datei anzeigt, wenn der Eintrag in der Dateiprüfsummen.md5 nicht übereinstimmt. Wenn am Ende des Tests /tmp/compare.resultleer ist, können Sie darauf vertrauen, dass alle Dateien korrekt kopiert werden, da die Prüfsummen übereinstimmen.

Beachten Sie, dass nur in der /tmp/checksums.md5Datei aufgeführte Dateien auf eine korrekte Prüfsumme überprüft werden. Wenn sich zusätzliche Dateien im /mnt/backupVerzeichnis befinden, werden Sie von md5deep nicht darüber informiert.

Anmerkungen:

  • Sie müssen nicht unbedingt die Umleitung verwenden, um Ausgabedateien zu speichern. Weitere Informationen finden Sie im md5deep-Handbuch.

  • Abhängig von den Berechtigungen der Dateien, die Sie verarbeiten, müssen Sie möglicherweise md5deep-Befehle als root ausführen.

NordicViking
quelle
0

Wenn Sie die Unterschiede zwischen zwei Verzeichnissen rekursiv/path1 und /path2 ohne Verwendung überprüfen möchten md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Erläuterung:

  • bin path1dazu gekommen, alle gedruckten Zeilen findrelativ zu path1( cd /path1) zu machen
  • listet alle Dateien rekursiv im aktuellen Pfad auf ( && find . -type f)
  • Verwenden Sie jede Zeile, die von ausgegeben wird, findals Eingabe für md5( | xargs md5)

Die Ausgabe sieht folgendermaßen aus, wenn es Unterschiede gibt:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
david_p
quelle