ファイルの文字コードを一括で変更するシェルスクリプト(その2)
というワケで、前回のシェルスクリプトがダメダメだった件を受けて、ペーペーなりに改良してみました。
(= ‘艸’)ムププ
果たして、ホントに良くなったのでしょうか??
以下の2点を変更してみました。
- 引数としてユーザアカウント名を受けているので、そのユーザがそもそも存在するかをチェックする(tarballのファイル名にも利用するので)
- 処理対象ファイルの拡張子をループで抽出→抽出ファイルをループで処理、という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=***」の含まれないファイルに対しても実行されてしまうのが気になりますが、どう対策すれば良いかが分からないので得意の放置。再度ローカルでテストしてみると、(正確に計ってはいませんが)処理時間が体感で分かるほど向上していました。
おぉ~、これで後はもう少しテスト&検証を行えば(ひとまず)完成といって良いのでしょうか??
問題は「使うかどうか」なのですが…(ーΩー )
今日はここまでヾ(*’-'*)マタネー♪

こんばんは。
いつもブログの更新楽しみにしています。
シェルスクリプトも書けちゃうんですね☆すごい!
自分ももっとがんばらねば・・・
これからも参考にさせていただきます!
pazさん
こんばんは。
>シェルスクリプトも書けちゃうんですね
とんでもないです!!改良前のスクリプト約30行程度を
書くのに、2時間ほどかかってますから><
まだまだ勉強不足です。
>これからも参考にさせていただきます
平気な顔して間違った事発信しちゃいますから、
ドシドシ突っ込んでくださいね~。