Überprüfen, ob die Datei vorhanden ist

Überprüfen, ob die Datei vorhanden ist

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 -cum 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 md5suminsgesamt X * Y-mal aus. Mit dem oben Gesagten reduziert sich dies jedoch auf X + Y-mal.

Antwort2

mtreeist 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/checkhat Dateien image-001bis -010, während folder/to/searchhat image-002bis -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 extraZeile besagt, dass image-011.jpgin vorhanden war folder/to/search, aber nicht vorhanden sein musste (da es nicht in ist folder/to/check), und die missingZeile besagt, dass image-001.jpgim 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 extraund missingzusä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, mtreeerfahren 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).

verwandte Informationen