min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash 「複数のShift-JISファイル(csvとpyとbat)をnkfで変換してファイル名の末尾に_utf8をつけて保存する」をワンライナーでやる

Windowsで作ったShift-JISのファイルがある。拡張子がバラバラだ。csvとpyとbatが混在している。

f:id:min117:20171216222935p:plain

これを全部utf-8に変換し、かつファイル名の末尾に_utf8をつけるをコマンド一発でやりたい。最終的にこうなる

f:id:min117:20171216223344p:plain

たとえば「DB.csv」を「DB_utf8.csv」に変換するのには

① ファイル名を文字列「DB」と「.csv」に分割し、拡張子は変数に保持しておく。

② ファイルをnkfコマンドで(utf-8に)変換する

③ 変換後のファイル名として文字列「DB_utf8」を作りそれに「.csv」を合体する。

これを、拡張子「.py」「.bat」についてもやらなければならない。

 

<手順1>

まずは①を行う。拡張子だけを取り出すbashパラメータ展開機能を使えばよい

$ for i in *csv *bat *py; do echo "$i"; echo ${i#*.}; done

f:id:min117:20171216224201p:plain

bashのパラメータ展開機能については「シェルスクリプト基本リファレンス」が最高に分かりやすい。

$i に「DB.csv」が格納されているとき、シャープ記号を使って

${i#*.} とすればcsv」だけを取り出せる。

f:id:min117:20171216230202j:plain

「改訂新版」を使っていたけど最近「改訂第3版」が出たっぽい。

 

 拡張子だけ取り出せたのでそれを変数$extに入れる(拡張子→英語でエクステンション→extension→ext)。

$ for i in *csv *bat *py; do echo "$i"; echo "${i##*.}"; ext="${i##*.}"; echo "$ext"; done

f:id:min117:20171216231134p:plain

次にファイル名だけの取り出しを行う。つまり「DB.csv」から「DB」だけを取り出す。

$ for i in *csv *bat *py; do echo "$i"; echo "${i%%.csv}"; done

f:id:min117:20171216232044p:plain

これもbashのパラメータ展開機能だが、シャープ記号ではなパーセント記号を使っている

f:id:min117:20171216230953j:plain

<手順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

f:id:min117:20171216232717p:plain

ここまでくれば、あとは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

f:id:min117:20171216233758p:plain

流してみる。

f:id:min117:20171216233813p:plain

nkf -g コマンドで utf-8 になっているのを確認。

f:id:min117:20171216234343p:plain

Linux 最高すぎる。