ファイルをループしてBMPファイルをJPGに変換する

ファイルをループしてBMPファイルをJPGに変換する

画像のフォルダがあります。すべてJPG拡張子ですが、fileいくつかを実行するとビットマップとして返​​されます。

25818.jpg: PC bitmap, Windows 3.x format, 357 x 500 x 24

私の質問は、すべての画像をループして、ビットマップ ファイルであるかどうかを確認し、それを JPG に変換するにはどうすればよいかということです。

単一のケースで使用するコマンドは次のようになりますが、どのようにチェックしてファイルをループするかはわかりません。

mogrify -format jpg 25818.jpg

ありがとう

答え1

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)

は、の引数として BMP ファイルを指定したときにのバージョンfileが出力する場合に機能します。それ以外の場合は、スクリプトを変更する必要があります。image/x-ms-bmpfile -b --mime-type

多くのユーザーはよりシンプルなバージョンで満足するだろう

for filename in ./*.jpg; do 
  [[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
      && mogrify -format jpg "$filename"
done

しかし、状況によっては失敗することがあります。1)とても多数のファイルとても長い名前 (たとえば、平均長さのファイル名が 30000 個) 2) ファイル名に非常に奇妙な文字が含まれている場合。

最初のバージョンでは、このようなまれな不便さは保証されています。

答え2

を使用するとexiftool、次の操作を実行できます。

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

関連情報