arc の日記

はてなダイアリーから引っ越してきました。さらに新しい記事は https://junkato.jp/ja/blog/ で書いています。

画像を縮小してHTMLでサムネイル化するシェルスクリプト

MacPortsMac miniImageMagickをインストールしたので、撮りためたデジカメの写真を一気にサムネイル化してしまおうと考えました。

僕の環境では、画像ファイルは全部「写真」フォルダの中のサブフォルダ(イベントごとに「2009-01 新年」などの名前がついている)直下に入れています。次の目標を立てました。

  • 各サブフォルダ下にthumbsというフォルダを作る
  • thumbsに適当なサイズに縮小した画像ファイルを保存する
  • 各サブフォルダ下にindex.htmlというファイルを作る
    • index.htmlを開くとサムネイルが見え、クリックすると原寸の画像が開く

で、bash用のスクリプトを書いたらこうなりました。

#!/bin/bash

find . -maxdepth 1 -mindepth 1 -type d |
while read d
do

# ディレクトリに入る
 echo $d
 cd "$d"
 mkdir thumbs
 echo "<html><head><title>$d</title></head><body>" > index.html

# ファイルごとの処理
 for f in *.JPG
 do

  if [ -e thumbs/$f ]; then
   echo "$f already exists. (skipped)"
  else
   /opt/local/bin/convert -geometry 200x150! $f thumbs/$f
   echo $f
  fi
  echo "<a href=$f><img src=thumbs/$f width=200 height=150 /></a>" >> index.html

 done
 echo "</body></html>" >> index.html
 cd "../"

done

サブフォルダの一覧を取得してフォルダごとに処理を走らせる冒頭の部分が一番難しかったです。半角スペースを含んだフォルダ名は、単純に ls コマンドで一覧を取得しただけでは二フォルダ扱いされてしまう等。けっきょくfindでmindepthとmaxdepthを共に1として直下のフォルダ一覧のみ取得するようにして対応しました。

あとは、サブフォルダごとにthumbsフォルダとindex.htmlを作成し、見つかったファイルごとに縮小をかけて、タグをHTMLに追記する処理が続いておしまいです。ImageMagickのconvertコマンドのパスは環境に応じて書き換えてください。他は一般的なUNIXコマンドしか使っていないので普通に動くと思います。

このスクリプトを親フォルダに入れて走らせれば、自動的にサムネイルができあがります。