画像のフォルダがあります。すべて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-bmp
file -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