Wie kann ich ungültige Bilder finden?

Wie kann ich ungültige Bilder finden?

Ich habe ein Verzeichnis mit Unterverzeichnissen. In den Verzeichnissen befinden sich viele aus dem Internet gecrawlte Bilder.

Wie durchlaufe ich alle Dateien und zeige die Dateien an, die keine gültigen Bilddateien sind?

Es sollte nicht auf der Dateierweiterung basieren.

Ich habe mir dieses Skript ausgedacht:

find . -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' | while read FILE; do
    if ! identify "$FILE" &> /dev/null; then
         echo "$FILE"
    fi  
done

Dies funktioniert jedoch nicht, da auch gültige Bilder ausgegeben werden.

Antwort1

find . -type f \
       \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \
       -exec sh -c '! file -b --mime-type "$1" | grep -q "^image/"' sh {} \; \
       -print

Mein Ansatz besteht darin, -execeinen benutzerdefinierten Test an Dateien durchzuführen. Zum Erstellen einer Pipe ist eine Shell erforderlich. Für jede Datei mit der richtigen Erweiterung wird eine separate Shell ausgeführt, daher ist die Leistung der Lösung eher schlecht.

Die Shell führt aus file -b --mime-typeund grepprüft dann, ob das Ergebnis mit beginnt image/. !am Anfang der Pipe negiert ihren Exit-Status, sodass der gesamte -execTest erfolgreich ist, sofern die Datei nicht wirklich ein Bild ist. Der Pfad wird dann ausgegeben.

Anmerkungen:

  1. Lassen Sie -namedie Tests aus, um alle Dateien zu prüfen.
  2. Oder Sie möchten -inameanstelle von verwenden -name.
  3. -inamewird von POSIX jedoch nicht benötigt. Weder ist -bnoch eine --mime-typeOption von erforderlich file.
  4. Das Folgende führt zu einer etwas anderen Ausgabe und ist schneller:

    find . -type f \
           \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \
           -exec file --mime-type {} + \
    | grep -v "\bimage/"
    

    AberEinige Dateinamen (z. B. mit Zeilenumbrüchen) oder Pfade (mit image/) zerstören die Logik.

Antwort2

Sie müssen dies tun, indem Sie die Dateitypsignaturen überprüfen. Sie finden sieHier, oder Sie können es durch Ausprobieren Ihrer Dateien herausfinden.

Beispielsweise lautet die JPG-Signatur FF D8 FF E0, was bedeutet, dass die ersten vier Bytes gleich sein müssen FF D8 FF E0.

Alles was Sie brauchen, ist ein Tool, um diese Bytes mit denen der Datei abzugleichen. Beispielsweise hexdump -n 4 -C file.jpg| awk '{print $2 $3 $4 $5}'gibt es diese Bytes im Hexadezimalformat zurück, die mit der gewünschten Signatur verglichen werden können.

Wenn Ihre Bilddateien beschädigt sein könnten, finden Sie erweiterte Informationen zu Dateisignaturen und WiederherstellungHier. Beispielsweise, wenn nur ein Bruchteil eines Bildes heruntergeladen wird.

Antwort3

Die Überprüfung von Dateierweiterungen und Magic Bytes kann leicht manipuliert werden. Siehehttps://unix.stackexchange.com/questions/189364/script-to-determine-if-apparent-image-files-are-real-image-files/189367#189367Zur Inspiration: Verwenden Sie grundsätzlich ImageMagick, um zu prüfen, ob das Bild gültig ist, aber selbst dann kann es gefälscht werden! Es gibt also keine perfekte Möglichkeit zur Prüfung.

verwandte Informationen