特定フォルダ以下のすべての画像を圧縮するワンライナー

動機

ウェブサイトを作っていると、「のせる画像のサイズを制限したい」という欲望に駆られることが多いですが、コマンドラインで一つづつ圧縮していくのはめんどかったりします。

しかし、圧縮率とかを間違えて圧縮しすぎても困ります。ということでコピペに便利そうなワンライナーを書きました。

注意

使用しているコマンドは不可逆な変化を引き起こすので、gitでコミットするなりバックアップとるなりしてください。
また、画像以外の大きなファイルがあった場合は変な動作をするかもしれません。

本体

size=290 && ratio=99 && cmd='find . -size +'${size}'k' && while true; do string=`${cmd}` && array=(${string// / }) && if [ ${#array[@]} = 0 ];then break;fi && echo "----${#array[@]} file is over the size----" && for v in "${array[@]}";do echo $v; mogrify -resize ${ratio}% $v; done ; echo '';done

解説

仕組みとしては、sizeを超えるサイズの画像をratioに定められた割合だけmogrifyで少しずつ画像のサイズを小さくしていき、sizeを超えるサイズの画像がなくなるまで繰り返すというものです。なくなった場合は止まります。

ループだったり文字列を配列に分割しているあたりは自分で調べてみてください。いい勉強になると思います。

ratioを100に近づけることで、sizeに近いサイズにすることができますが当然その分だけ時間がかかるのでそれに注意して数字を決めてください。まあ困ることは無いと思います。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.