[MacBook Air] bashで複数のPNGファイルを一括&一発でロスレス圧縮する方法
これまでの経緯
ブログ用の画像ファイルが複数 or 沢山ある場合、それらの画像ファイルを一回一回手打ちコマンドでロスレス圧縮するのは面倒です。そこで、以下のようなスクリプトを bash で書いて実現しました。ブログは MacBook Air で書いているので MacBook Air で実行できることを確認済み。これを叩きに改良していこうと思います。
スクリプトを実行する前提条件
- optipng コマンドが MacBook Air にインストールされている必要がある
- ロスレス圧縮したファイルを保存するディレクトリ(保存先ディレクトリ)が事前に作成されている必要がある
- 一時ファイルを保存するディレクトリ (例: tmp ディレクトリ) が作成されている必要がある
- スクリプト実行時に引数を 1 つ指定する必要がある。この引数は圧縮前のファイルが保存されているディレクトリになる
- 圧縮前のファイルが 1 つのディレクトリに保存されている必要がある
スクリプトが実現する機能
- ロスレス圧縮して作ったファイルを保存先ディレクトリに保存する
- 上記 1 を実行する前に、もし保存先ディレクトリに PNG ファイルが存在していたら削除する
- optipng コマンドで PNG ファイルをロスレス圧縮する
- 上記 3 でロスレス圧縮が完了したら圧縮される前の元ファイルを削除する
bash スクリプト
#!/bin/bash #-------------------------------------------------- # Variables #-------------------------------------------------- BASEDIR="/Users/hogehoge" TMPDIR="${BASEDIR}/tmp" TMPFILE="${TMPDIR}/png_file_list.tmp" SRCDIR="$1" DSTDIR="${SRCDIR}/optimize" EXTENSION="png" #-------------------------------------------------- # Main #-------------------------------------------------- ls -1 ${SRCDIR}/*.${EXTENSION} > ${TMPFILE} ls ${DSTDIR}/*.${EXTENSION} if [ $? -eq 0 ]; then rm -f ${DSTDIR}/*.${EXTENSION} fi num=1 while read pngfile do echo "creating file${num}..." DSTFILE="${DSTDIR}/${num}.${EXTENSION}" optipng -o7 "${pngfile}" -out ${DSTFILE} num=`expr ${num} + 1` rm -f "${pngfile}" done < ${TMPFILE}
スクリプト実行方法
ターミナルを起動して以下のように実行する。compress_png_files.bash が bash スクリプトのファイル名です。
$ ./compress_png_files.bash $HOME/Dropbox/Blog/僕とガジェット/画像
僕がブログ用の画像をたとえばスマホで撮ったらそれを一旦 Dropbox 上のディレクトリに保存するようにしています。だから画像を保管するディレクトリは Dropbox 上にあっても OK です。
またスクリプトを読んで頂ければわかりますが、上記「スクリプトを実行する前提条件」の2番めに書いた保存先ディレクトリというのは、僕が自分で作った optimize ディレクトリです。optimize は最適化するという意味ですから、そこに最適化されたファイル=ロスレス圧縮されたファイルを保管しようと思ったわけです。
このスクリプトを実行すると画面にいろいろ表示が出ます。これは表示させないようにもできるんでしょうが、そこまでやっていません。