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, -exec
einen 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-type
und grep
prüft dann, ob das Ergebnis mit beginnt image/
. !
am Anfang der Pipe negiert ihren Exit-Status, sodass der gesamte -exec
Test erfolgreich ist, sofern die Datei nicht wirklich ein Bild ist. Der Pfad wird dann ausgegeben.
Anmerkungen:
- Lassen Sie
-name
die Tests aus, um alle Dateien zu prüfen. - Oder Sie möchten
-iname
anstelle von verwenden-name
. -iname
wird von POSIX jedoch nicht benötigt. Weder ist-b
noch eine--mime-type
Option von erforderlichfile
.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.