イメージフォルダがあります。すべて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