最近、卒業研究の関係でlinuxでプログラムを書いています。linuxで画像処理を行う時はPPM形式の画像ファイルが都合がいいので、使用する画像が違うファイル形式だった場合、PPMファイルへの変換作業をしなければなりません。
convert 元ファイル名 変換後のファイル名
で簡単に変換できますが、大量にあった場合などは自動化しないとやってられません。
そこで全ての一階層下のディレクトリに入っている画像ファイルをPPM形式に変換するバッチを書きました。
画像ファイルの拡張子をPPMに置換するところがポイントです。まずは、
files=(`ls`)
でfilesにそのディレクトリにあるファイル名がそれぞれ配列ですべて格納されます。
この格納された値のドットの部分をスペースに置換します。
itr_j=0
buf=${files[$itr_j]//./ /}
とすれば$filesの0番目の配列に格納されているファイル名のドットがスペースで置換されます。
例えば、image.gifがimage gifに置換されます。
次に
buf=($buf)
という命令で、スペースで分割した文字列がそれぞれ配列に格納されます。つまり0番目の配列にファイル名、1番目の配列に拡張子が入ります。
C言語的に言うと、
buf="image gif"
だったものが
buf={"image", "gif"}
になったということです。
次にこの0番目の配列に格納されたファイル名を利用してPPMファイルのファイル名を作ります。
ppmFile=${buf[0]}".ppm"
という風に単純に後ろに.ppmをつければOKです。
最後に、もとのファイル名とこのファイル名を利用して画像のコンバートを行います。
convert ${files[$itr_j]} $ppmFile
これをwhileですべてのファイルに実行して上げれば一発でファイルの変換が行えます。
whileで回すときは配列のサイズを得ないといけません。配列のサイズは
${#filename[*]}
で得ることができます。
以下がソースコードです。
DIRs=(`ls`)
itr_i=0
#全てのディレクトリを参照
while test $itr_i -lt ${#DIRs[*]};do
if test -d ${DIRs[$itr_i]};then
echo ${DIRs[$itr_i]}
cd ${DIRs[$itr_i]}
files=(`ls`)
itr_j=0
#すぺてのファイルをppmに変換
while test $itr_j -lt ${#files[*]};do
#ファイル名の.をスペースに置換
buf=${files[$itr_j]//./ /}
#スペースで分割した文字列を
#それぞれ配列に格納
#(0にファイル名、1に拡張子)
buf=($buf)
if [ ${buf[1]}!="ppm" ];then
#拡張子に.ppmをつける
ppmFile=${buf[0]}".ppm"
#ファイルをppmへ変換
convert ${files[$itr_j]} $ppmFile
echo ${files[$itr_j]}"->"$ppmFile
fi
itr_j=`expr $itr_j + 1`
done
cd ..
fi
itr_i=`expr $itr_i + 1`
done
どうでもいいですが、なんかシェルスクリプトってMELスクリプトに似てますね。すぐに慣れることができました。自動化って楽しいですね。