Ich habe einen Ordner mit Bildern. Alle haben die Erweiterung JPG, aber wenn ich sie file
mit einigen verarbeite, werden sie als Bitmap zurückgegeben, z. B.
25818.jpg: PC bitmap, Windows 3.x format, 357 x 500 x 24
Meine Frage ist nun, wie ich alle Bilder durchlaufe, überprüfe, ob es sich um eine Bitmap-Datei handelt und sie dann in ein JPG konvertiere?
Der Befehl, den ich in einem einzelnen Fall verwenden würde, wäre der folgende, aber ich bin nicht sicher, wie ich die Prüfungen durchführen und die Dateien durchlaufen würde
mogrify -format jpg 25818.jpg
Danke
Antwort1
while IFS='' read -rd '' filename; do
[[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
&& mogrify -format jpg "$filename"
done < <(LC_ALL=C find . -maxdepth 1 -name '*.jpg' -print0)
funktioniert, vorausgesetzt, dass Ihre Version von file
ausgibt image/x-ms-bmp
, wenn als Argument eine BMP-Datei angegeben wird file -b --mime-type
. Andernfalls müssen Sie das Skript ändern.
Viele Benutzer würden sich mit der einfacheren Version zufrieden geben
for filename in ./*.jpg; do
[[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
&& mogrify -format jpg "$filename"
done
Dies würde jedoch unter bestimmten Umständen fehlschlagen: 1) Wenn Sie einsehrgroße Anzahl von Dateien mitsehrlange Namen (sagen wir, 30.000 Dateinamen durchschnittlicher Länge) 2) wenn Ihre Dateinamen wirklich seltsame Zeichen enthalten.
Bei der ersten Version sind derartige seltene Unannehmlichkeiten ausgeschlossen.
Antwort2
Mit exiftool
können Sie Folgendes tun:
exiftool -q -r -ext jpg -if '
$FileType eq "BMP" and !print "$Directory/$FileName\0"' . |
xargs -r0 mogrify -format jpg