
Ich habe einen Ordner mit Tausenden (70 GB folder/to/check/
) Bildern und ich möchte für jede Datei prüfen, ob sie bereits in einem anderen Verzeichnis mit Tausenden von Bildern (414 GB folder/to/search/
) vorhanden ist.
Das ist das Skript, das ich erstellt habe, aber es dauert sehr lange, es auszuführen, daher glaube ich, dass die Aufgabe optimiert werden könnte.
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
Hat jemand eine Idee oder kann mir zeigen, wie ich das Skript optimieren kann? Meine Kenntnisse sind allerdings sehr rudimentär.
Antwort1
Mach das.
Berechnen Sie die MD5-Summe jedes Bildes im Ordner „zu prüfen“ und schreiben Sie sie in eine Textdatei.
Berechnen Sie die MD5-Summe jedes Bildes im Ordner „zu durchsuchen“ und hängen Sie sie an die 1. Datei an.
Sortieren Sie diese riesige Datei in eine neue Datei.
Verwenden Sie etwas wie,
uniq -c
um zu ermitteln, wie oft jede Zeile dupliziert wird.
Wenn ich Ihren Befehl richtig verstanden habe (was vielleicht nicht der Fall ist), führen Sie ihn momentan md5sum
insgesamt X * Y-mal aus. Mit dem oben Gesagten reduziert sich dies jedoch auf X + Y-mal.
Antwort2
mtree
ist ein praktisches Dienstprogramm, wenn Sie zwei Dateihierarchien vergleichen und nach gleichen/unterschiedlichen Zeitstempeln oder gleichen/unterschiedlichen MD5/SHA256-Hashes suchen müssen.
Lassen Sie uns eine einfache Testhierarchie einrichten:
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
hat Dateien image-001
bis -010
, während folder/to/search
hat image-002
bis -011
. Alle Dateien sind identisch (null Bytes lang), haben aber unterschiedliche Zeitstempel.
Wenn dunurden MD5-Hash (und das Vorhandensein/Fehlen jeder Datei) prüfen möchten, dann:
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
Die extra
Zeile besagt, dass image-011.jpg
in vorhanden war folder/to/search
, aber nicht vorhanden sein musste (da es nicht in ist folder/to/check
), und die missing
Zeile besagt, dass image-001.jpg
im Quellordner ( folder/to/check
) gefunden wurde, aber nicht im Zielordner ( folder/to/search
).
Wenn Sie zusätzlich zum MD5-Hash den Zeitstempel überprüfen möchten, dann:
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Diese Ausgabe zeigt immer noch dieselben Zeilen extra
und missing
zusätzlich eine Anzahl von Dateien, die im MD5-Hash identisch sind, aber unterschiedliche Zeitstempel haben. Wenn eine der Dateien einen anderen MD5-Hash als ihr Gegenstück hat, mtree
erfahren Sie, welche das sind:
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Antwort3
Es gibt hierfür Dienstprogramme, aber wenn Sie es selbst tun möchten:
- Ermitteln Sie die Größe aller Dateien in Bytes und erstellen Sie Listen aller Dateien mit exakt derselben Größe.
- Für Listen mit mehr als einem Element (nicht so viele, insbesondere bei großen Dateien):
- Berechnen Sie den MD5 aller Elemente der Liste
- auf Duplikate prüfen
Im Wesentlichen berechnet man damit den MD5-Hasheinmalund nur für Dateien, bei denen Sie die Größe nicht unterscheiden können.
Dies setzt natürlich voraus, dass es weder unter den vorhandenen noch unter den neuen Dateien Duplikate gibt (kann aber leicht angepasst werden, um auch dies zu überprüfen).