it-swarm.com.de

Wie vergleiche ich zwei Dateien mit mehreren md5-Prüfsummen, um geänderte Dateien zu ermitteln?

Ich habe zwei Dateien MD1 und MD2.

MD1 enthält md5sums:

5f31caf675f2542a971582442a6625f6  /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreator/hash3.txt

dabei sind hash1, hash2 und hash3 drei Dateien im Ordner md5filescreator.

Ebenso enthält MD2:

163559001ec29c4bbbbe96344373760a  /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreators/hash3.txt

diese Dateien befinden sich im Ordner md5filescreators.

Ich möchte die Prüfsummen in md5filescreator mit der Prüfsumme der entsprechenden Datei in md5filecreators vergleichen.

Das Shell-Skript sollte OK für Dateien mit denselben Prüfsummen und FALSE für diejenigen, die dies nicht sind, zusammen mit den Dateinamen zurückgeben.

Ist dies mit md5sum --check möglich (da normalerweise nur in 1 MD5-Datei auf Änderungen geprüft wird)?

6
swapedoc

Ich möchte wissen, ob dies mit md5sum --check durchgeführt werden kann? (da normalerweise nur in 1 MD5-Datei nach Änderungen gesucht wird).

Nein, das kann es nicht.

md5sum --check liest den Pfad zu jeder Datei in der zweiten Spalte der Eingabedateien und überprüft deren MD5-Prüfsumme anhand der in der ersten Spalte angegebenen Prüfsumme. Wenn Sie die Prüfsummen in den beiden Dateien direkt vergleichen möchten, müssen Sie die Textdateien vergleichen.

Mit paste + AWK können Sie Folgendes tun:

paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
  • paste file1 file2: Verbindet Zeile N von file1 mit Zeile N von file2;
  • awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}': Wenn das erste Feld dem dritten Feld entspricht (dh die MD5-Summen stimmen überein), weist x "OK" zu, andernfalls weist x "FALSE" zu und druckt das zweite Feld (dh der Dateiname) gefolgt vom Wert von x.
% cat file1
5f31caf675f2542a971582442a6625f6 /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreator/hash3.txt
% cat file2
163559001ec29c4bbbbe96344373760a /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreators/hash3.txt
% paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
/root/md5filescreator/hash1.txt FALSE
/root/md5filescreator/hash2.txt OK
/root/md5filescreator/hash3.txt OK
5
kos

Eine einfache Möglichkeit, dies zu überprüfen, besteht darin, festzustellen, welche Zeilen nicht über beide Dateien hinweg dupliziert wurden:

sort file1 file2 | uniq --unique

uniq --unique druckt die Zeilen, die nicht wieder aufgetaucht sind . Dementsprechend haben die Dateien, deren Hashes übereinstimmen, doppelte Zeilen und werden in der Ausgabe nicht angezeigt. Verwenden Sie grep, um einfach zu testen, ob eine Ausgabe erstellt wurde:

sort file1 file2 | uniq --unique | grep -q .

In diesem Fall ist etwas mehr Verarbeitung erforderlich, da die Verzeichnisse unterschiedlich sind:

awk -F/ '{print $1, $NF}' | sort | uniq --unique | awk '!a[$2]++{print $2}'

Oder ganz in awk:

awk -F/ 'FNR == NR {hash[$NF] = $1; next} hash[$NF] != $1 {print $NF}'

In beiden Fällen erhalten Sie nur die Dateinamen, deren Hashes sich unterscheiden.

2
muru