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

4-3.文字列置換

複数ファイルの文字コードを変換したいと思います。
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を指定してますが、文字コードの変換対象でないファイルは、タイムスタンプを同じにしておきたいから指定しています。

コメント

タイトルとURLをコピーしました