ファイルの文字コードを一括で変更するシェルスクリプト(その2)

2009 年 5 月 31 日 | カテゴリー: LAMP奮闘記, Linux

というワケで、前回のシェルスクリプトがダメダメだった件を受けて、ペーペーなりに改良してみました。
(= ‘艸’)ムププ

果たして、ホントに良くなったのでしょうか??

以下の2点を変更してみました。

  1. 引数としてユーザアカウント名を受けているので、そのユーザがそもそも存在するかをチェックする(tarballのファイル名にも利用するので)
  2. 処理対象ファイルの拡張子をループで抽出→抽出ファイルをループで処理、という2重ループを1回で済ませる

まず1.は、単純に引数チェックの条件を追加しました。「||」演算子の使い方は、PHPやC言語と同じみたいですね。

# 引数チェック
if [ -z $1 ] || [ ! -d /home/$1 ]; then
    echo 'Usage: ./convert.sh $ACCOUNT_NAME'
    exit 1
fi

で、2.についてはfindコマンドをちゃんと調べてみたところ(調べてなかったんかい!! オラァ(p゚ロ゚)==p)`д)グハッ)、やはり「-o」や「-a」オプションで検索条件を追加出来るみたいでした。ただ、対象となるファイルの拡張子は「.html」「.js」「.css」「.php」なので、これを1つずつ記述すると冗長な感じ。

なので、「-regex」オプションで正規表現を利用してみました。

files=`find ./$1 -regex '.*\.\(html\|css\|js\|php)$' -print`

PHPのpreg_match()なんかに比べてエスケープ対象が多いので、ちょっとハマってしまいましたが、これをターミナルで実行してみると期待通りの結果が出力されました(≧∇≦)b

後は、ループ箇所を適宜修正して、最終的にはこんなスクリプトになりました~。

convert.sh

#!/bin/bash

# 引数チェック
if [ -z $1 ] || [ ! -d /home/$1 ]; then
    echo 'Usage: ./convert.sh $ACCOUNT_NAME'
    exit 1
fi

# public_htmlを圧縮
tar zcf $1.tar.gz ./public_html
if [ $? -ne 0 ]; then
    echo 'Compress error'
    exit 1
fi

# 特定のファイルのみ処理
files=`find ./public_html -regex '.*\.\(html\|css\|js\|php)$' -print`

for file in $files
do
    # 文字コード変換前にhtmlファイルのcharsetを変更
    sed -e 's/charset=euc-jp/charset=utf-8/g' $file > $file.tmp
    nkf -w $file.tmp > $file.new
    if [ $? -ne 0 ]; then
        echo 'Convert error'
        exit 1
    else
        rm -f $file.tmp
        mv $file.new $file
    fi
done

sedコマンドが「charset=***」の含まれないファイルに対しても実行されてしまうのが気になりますが、どう対策すれば良いかが分からないので得意の放置。再度ローカルでテストしてみると、(正確に計ってはいませんが)処理時間が体感で分かるほど向上していました。

おぉ~、これで後はもう少しテスト&検証を行えば(ひとまず)完成といって良いのでしょうか??

問題は「使うかどうか」なのですが…(ーΩー )

今日はここまでヾ(*’-'*)マタネー♪

  1. paz
    2009 年 5 月 31 日 22:42

    こんばんは。

    いつもブログの更新楽しみにしています。
    シェルスクリプトも書けちゃうんですね☆すごい!
    自分ももっとがんばらねば・・・

    これからも参考にさせていただきます!

  2. taro
    2009 年 5 月 31 日 23:30

    pazさん

    こんばんは。

    >シェルスクリプトも書けちゃうんですね

    とんでもないです!!改良前のスクリプト約30行程度を
    書くのに、2時間ほどかかってますから><

    まだまだ勉強不足です。

    >これからも参考にさせていただきます

    平気な顔して間違った事発信しちゃいますから、
    ドシドシ突っ込んでくださいね~。