Windowsで作ったShift-JISのファイルがある。拡張子がバラバラだ。csvとpyとbatが混在している。
これを全部utf-8に変換し、かつファイル名の末尾に_utf8をつけるをコマンド一発でやりたい。最終的にこうなる。
たとえば「DB.csv」を「DB_utf8.csv」に変換するのには
① ファイル名を文字列「DB」と「.csv」に分割し、拡張子は変数に保持しておく。
③ 変換後のファイル名として文字列「DB_utf8」を作りそれに「.csv」を合体する。
これを、拡張子「.py」「.bat」についてもやらなければならない。
<手順1>
まずは①を行う。拡張子だけを取り出す。bashのパラメータ展開機能を使えばよい。
$ for i in *csv *bat *py; do echo "$i"; echo ${i#*.}; done
bashのパラメータ展開機能については「シェルスクリプト基本リファレンス」が最高に分かりやすい。
$i に「DB.csv」が格納されているとき、シャープ記号を使って
${i#*.} とすれば「csv」だけを取り出せる。
「改訂新版」を使っていたけど最近「改訂第3版」が出たっぽい。
拡張子だけ取り出せたのでそれを変数$extに入れる(拡張子→英語でエクステンション→extension→ext)。
$ for i in *csv *bat *py; do echo "$i"; echo "${i##*.}"; ext="${i##*.}"; echo "$ext"; done
次にファイル名だけの取り出しを行う。つまり「DB.csv」から「DB」だけを取り出す。
$ for i in *csv *bat *py; do echo "$i"; echo "${i%%.csv}"; done
これもbashのパラメータ展開機能だが、シャープ記号ではなパーセント記号を使っている。
<手順2>
ここまでで、拡張子とファイル名をそれぞれ取り出すことができたので
③変換後のファイル名として文字列「DB_utf8」を作りそれに「.csv」を合体する処理
を「.py」「.bat」に対して一度にやることができる。
やってみる。
$ for i in *csv *bat *py; do echo "$i"; echo "${i##*.}"; ext="${i##*.}"; echo "$ext"; echo "${i%%.$ext}"; done
ここまでくれば、あとはnkfコマンドで変換するだけ。変換後の(utf-8での)出力をリダイレクトして "${i%%.$ext}"_utf8."$ext" として保存してやればよい。
$ for i in *csv *bat *py; do echo "$i"; echo "${i##*.}"; ext="${i##*.}"; echo "$ext"; echo "${i%%.$ext}"; nkf -wLux "$i" >> "${i%%.$ext}"_utf8."$ext"; done
流してみる。
nkf -g コマンドで utf-8 になっているのを確認。
Linux 最高すぎる。