4.Cywinによる小ワザ (1)サムネール画像の作成
Windowsのエクスプローラから辿れるところにある画像をイッキにサムネールを作成するスクリプトを作る。
具体的には、
画像置き場が
sambaで見えている、
My
DocumentsあたりでHTMLを作っていて、あとでftpあたりのツールで鯖に送ろうとしている
等の状況を想定している。これらのフォルダにある多数の画像を、下表のような名前付けの対応にしたがってサムネール化する。画像系のHTMLページに便利
か も。
このような処理を行うときには、シェルスクリプトでバッチ処理をすると便利である。ディレクトリ名の取得はfindで、ファイル名前の書き
換えはawk、画像の書き換えにはconvertを使う。
元画像名前
|
サムネール
|
a0001.jpg
|
a0001_.jpg
|
a0002.jpg
|
a0002_.jpg
|
a0003.jpg
|
a0003_.jpg
|
:
|
:
|
xyz01.jpg
|
xyz01_jpg
|
yyy.jpg
|
yyy_.jpg
|
zzz.jpg
|
zzz_jp
|
サムネールを作るには、ImageMagickの/bin/convert を使う。
convert -thumbnail 縦x横 元画像名 変換後画像名
と指定してやる。
ファイルネームの加工はfindとawkとgrepでやってみる。あるフォルダにある、ファイルネームの拡張子を除いた部分を抽出するには
% find `pwd` | awk -F / '{print
$NF
;}'|awk -F . '{print $1 ;}'
この1行コマンドの意味であるが、たとえばあるディレクトリでfindすると、
/cygdrive/j/public_html/computer/cygwin/setup8.jpg
と出力される。この出力結果を加工する。フォルダの階層は"/"で区切られ、拡張子との区切りは"."で区切られているので、
/で区切られた最後(awkの$
NF)の部分 の"うんたら.jpg"がファイル名 →
awk
-F / '{print $NF ;}'
ファイル名の.の前
(awkの$1)がファイル名本体、その後ろ(awkの$2、jpgの部分)が拡張子 → awk
-F . '{print $1 ;}'
と区分けする。これをパイプ"|"で繋いで、順次実行するようにする。
それから、findの結果を再帰的にconvertに渡すには
#!/bin/sh
for i in `find うんたら`;do
convert こうたら
done
exit 0
とfor〜doneループの入れ子にして実行すれば良い。
結論。作ったスクリプト。
FOLDERNAMEのところに目標のフォルダを指定する。コマンドラインの引数のARGVとして渡せばもっとスマートか?でも、タイプミスするのが怖い
ので、変数と して渡すことにした。
#!/bin/sh
FOLDERNAME='/cygdrive/j/public_html/computer/cygwin/'
for
i in `find ${FOLDERNAME} |grep -i jpg` ;do
/bin/convert -thumbnail 200x400
$i `echo $i | awk -F / '{print $(NF) ;}'|awk -F . '{print $1 ;}'`_.jpg
done
てな感じでスクリプト完成!とする。適当な名前、makethumbnail.sh
とかテキトーな名前を付けて保存する。実行属性を付けて実行可能としておく。
#
chmod +x makethumbnail.sh
実行は
#
./makethumbnail.sh
とすればOK。
なお、応用として、一気にjpegをgifに変換するというワザにも使える。具体的にはdoneの前の.jpgを.gifと書き換えるだけ。
続きの、5.
Cywinによる小ワザ(perl編)に続く
cygwinの入り口に
戻る。
もしくはHOMEに戻る。