Wie kann ich überprüfen, ob alle Dateien in Verzeichnisse gültig sind jpegs (Linux sh script notwendig)?
Ok, ich hab ein Verzeichnis (z.B. mit dem Namen'. /Fotos'), in denen gibt es verschiedene Verzeichnisse
(wie '/Fotos/Hochzeit', '/Fotos/Geburtstag', '/Fotos/graduation', etc...) die haben .jpg-Dateien in Ihnen. Leider, einige jpeg-Dateien werden gebrochen. Ich muss einen Weg finden, wie Sie feststellen, welche Dateien kaputt sind.
Ich fand heraus, dass es tool namens imagemagic, das kann helfen, eine Menge. Wenn Sie es verwenden, wie diese:
identify -format '%f' whatever.jpg
es druckt den Namen der Datei nur, wenn die Datei gültig ist, wenn es nicht druckt es so etwas wie "erkennen: Nicht eine JPEG-Datei: beginnt mit 0x69 0x75 `whatever.jpg' @ jpeg.c/EmitMessage/232.".
So die richtige Lösung sein sollte, finden alle Dateien mit der Endung ".jpg", für Sie "identifizieren", und wenn das Ergebnis ist einfach nur der name der Datei nicht alles tun, und wenn das Ergebnis unterscheidet sich von dem Namen der Datei, dann speichern Sie den Namen der Datei somethere (wie in eine Datei "errors.txt").
Irgendwelche Ideen, wie kann ich wohl tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie diese in der bash-Skript-Datei oder direkt:
find -name "*.jpg" -type f |xargs --no-run-if-empty identify -format '%f' 1>ok.txt 2>errors.txt
Im Falle
identify
fehlt, hier ist, wie es zu installieren in Ubuntu:sudo apt install imagemagick --no-install-recommends
find -name '*.jpg' -exec identify -format "%f" {} \; 1>ok.txt 2>errors.txt
.Ein problem mit
identify -format
ist, dass es nicht wirklich überprüfen, dass die Datei nicht korrupt ist, es macht einfach sicher, dass es wirklich ein jpeg.Tatsächlich testen Sie es, Sie brauchen etwas, um Sie zu konvertieren. Aber die konvertieren das kommt mit ImageMagick scheint still zu ignorieren, die nicht-fatale Fehler in der jpeg - (wie abgeschnitten.)
Eine Sache, die funktioniert, ist dies:
Wenn es einen Fehlercode zurückgibt, wird die Datei hat ein problem. Wenn nicht, ist es gut.
Gibt es andere Programme, die verwendet werden könnte als gut.
jpeginfo -c file
.for f in *.jpg; do djpeg -fast -grayscale -onepass $f > /dev/null; done
Kurz-kurz-version:
find . -iname "*.jpg" -exec jpeginfo -c {} \; | grep -E "WARNING|ERROR"
Müssen Sie möglicherweise nicht die gleichen Optionen, aber jpeginfo war die Lösung, die für mich gearbeitet:
find . -type f -iname "*.jpg" -o -iname "*.jpeg"| xargs jpeginfo -c | grep -E "WARNING|ERROR" | cut -d " " -f 1
als Skript (wie gewünscht, in dieser Frage)
War ich clued in jpeginfo für diese durch http://www.commandlinefu.com/commands/view/2352/find-corrupted-jpeg-image-files und dies erklärt mixing-find-o ODER mit -exec
identify
beschwert sich nicht über einige abgeschnitten jpg-Dateien habe ich, aberjpeginfo -c
hat, so empfehle ichjpeginfo -c
Dieses Skript druckt die Namen von den schlechten Dateien:
Könnten Sie ausführen, wie es ist oder wie
./badjpegs > errors.txt
speichern Sie die Ausgabe in eine Datei.Um es zu brechen, die
find
Befehl findet*.jpg
Dateien in/photos
oder eines seiner Unterverzeichnisse sein. Diese Dateinamen werden an eine while-Schleife, liest Sie in ein zu einer Zeit in die variable$FILE
. Innerhalb der Schleife Holen wir uns die Ausgabe vonidentify
mit der$(...)
operator und überprüfen, ob Sie mit der Datei Namen. Wenn nicht, die Datei ist schlecht und wir drucken den Namen der Datei.Kann es möglich sein, dies zu erleichtern. Die meisten UNIX-Befehle angeben, Erfolg oder Misserfolg in der exit-code. Wenn die
identify
Befehl, der dies tut, dann könnte man vereinfachen Sie das Skript auf:Hier die Bedingung vereinfacht sich zu
if ! identify; then
was bedeutet, "haben identifizieren scheitern?"