ディレクトリ構成のみコピー、複数ファイルを文字コード変換

複数ファイルの文字コードを変換したいと思います。
Shift_JISコードが使われているファイルセットとして、toppers/JSPカーネルを使います。こちらからダウンロードできます。
https://www.toppers.jp/download.cgi/jsp-1.4.4.1_full.zip

まずはunzipします。名前も変更しておきます。今後はこのoldディレクトリを使っていきます。

~$ unzip jsp-1.4.4.1_full.zip
~$ ls
jsp-1.4.4.1-full  jsp-1.4.4.1_full.zip
~$ mv jsp-1.4.4.1-full/ old
~$ ls
jsp-1.4.4.1_full.zip  old
~$ 

oldディレクトリからディレクトリ構成のみコピーしたnewディレクトリを作成します。

~$ a=old;find $a -type d | sed -e "s/$a/new/;s/^/mkdir /" | bash -x

old配下のディレクトリをfindして一覧取得し、それをmkdirするためのbashスクリプトを作成し、実行しました。
あるいは、上記のように回りくどいことをしなくとも、cpioコマンドを使ってディレクトリ構造コピーができます。

~$ (cd old;find -type d | cpio -pdm ../new)

では、old内の全ファイルをSJISからUTF8に変換し、newへコピーします。
()を使っているのは、oldへ切り替えたディレクトリを元に戻すためです。

~$ (cd old;for i in `find -type f`;do nkf -w < $i > ../new/$i;done)

少し時間がかかりますが、気長に待ちましょう。
変換が終わったら、変換できたことを確認するためnkf –guessの結果をuniqします。

~$ 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)
~$ 

BINARYが存在しています。本当のバイナリなのかテキストが壊れたのかわかりません。
ここで気づいたのが、変換したいファイルと変換したくないファイルの存在です。find -type fで抽出したファイルをすべてnkf -wで変換しましたので、意図していることと違っていました。変換をやり直しすることにします。
まずShift_JISかどうか判定する簡単なチェック関数を作成します。

~$ check(){
> a=`nkf --guess $1 | cut -b1`
> test $a = "S"
> }

さらに作成した関数のチェックです。Shift_JISのみ戻り値が0になるようになっています。

~$ echo あいう | check;echo $?
1
~$ echo あいう | nkf -s | check;echo $?
0
~$ 
~$ (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)
~$ 

これではShift_JISのファイルのみが変換されました。
cpコマンドを使うときに-pを指定してますが、文字コードの変換対象でないファイルは、タイムスタンプを同じにしておきたいから指定しています。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA