Durchlaufen Sie Dateien und konvertieren Sie BMP-Dateien in JPG

Durchlaufen Sie Dateien und konvertieren Sie BMP-Dateien in JPG

Ich habe einen Ordner mit Bildern. Alle haben die Erweiterung JPG, aber wenn ich sie filemit 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 fileausgibt 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 exiftoolkönnen Sie Folgendes tun:

exiftool -q -r -ext jpg -if '
  $FileType eq "BMP" and !print "$Directory/$FileName\0"' . |
  xargs -r0 mogrify -format jpg

verwandte Informationen