複数ファイルの文字コードを変換したいと思います。
Shift_JISコードが使われているファイルセットとして、toppers/JSPカーネルを使います。こちらからダウンロードできます。
https://www.toppers.jp/download.cgi/jsp-1.4.4.1_full.zip
takk~$ wget https://www.toppers.jp/download.cgi/jsp-1.4.4.1_full.zip
まずはunzipします。名前も変更しておきます。今後はこのoldディレクトリを使っていきます。
takk~$ unzip jsp-1.4.4.1_full.zip takk~$ ls jsp-1.4.4.1-full jsp-1.4.4.1_full.zip takk~$ mv jsp-1.4.4.1-full/ old takk~$ ls jsp-1.4.4.1_full.zip old takk~$
oldディレクトリからディレクトリ構成のみコピーしたnewディレクトリを作成します。
takk~$ a=old;find $a -type d | sed -e "s/$a/new/;s/^/mkdir /" | bash -x
old配下のディレクトリをfindして一覧取得し、それをmkdirするためのbashスクリプトを作成し、実行しました。
あるいは、上記のように回りくどいことをしなくとも、cpioコマンドを使ってディレクトリ構造コピーができます。
takk~$ (cd old;find -type d | cpio -pdm ../new)
では、old内の全ファイルをSJISからUTF8に変換し、newへコピーします。
()を使っているのは、oldへ切り替えたディレクトリを元に戻すためです。
takk~$ (cd old;for i in `find -type f`;do nkf -w < $i > ../new/$i;done)
少し時間がかかりますが、気長に待ちましょう。
変換が終わったら、変換できたことを確認するためnkf –guessの結果をuniqします。
takk~$ for i in `find new -type f`;do nkf --guess $i;done | sort | uniq ASCII ASCII (CRLF) ASCII (LF) BINARY UTF-8 UTF-8 (CRLF) UTF-8 (LF) UTF-8 (MIXED NL) takk~$
BINARYが存在しています。本当のバイナリなのかテキストが壊れたのかわかりません。
ここで気づいたのが、変換したいファイルと変換したくないファイルの存在です。find -type fで抽出したファイルをすべてnkf -wで変換しましたので、意図していることと違っていました。変換をやり直しすることにします。
まずShift_JISかどうか判定する簡単なチェック関数を作成します。
takk~$ check(){ > a=`nkf --guess $1 | cut -b1` > test $a = "S" > }
さらに作成した関数のチェックです。Shift_JISのみ戻り値が0になるようになっています。
takk~$ echo あいう | check;echo $? 1 takk~$ echo あいう | nkf -s | check;echo $? 0 ~$
takk~$ (cd old;for i in `find -type f`;do > if check $i; > then nkf -w < $i > ../new/$i; > else cp -p $i ../new/$i; > fi;done) takk~$
これではShift_JISのファイルのみが変換されました。
cpコマンドを使うときに-pを指定してますが、文字コードの変換対象でないファイルは、タイムスタンプを同じにしておきたいから指定しています。
コメント