f

アーカイブ

2015-05-31

nkfによる文字エンコーディング・改行コードのディレクトリ再帰的な一括変換

nkfコマンドを使って現在ディレクトリ以下のファイルを指定した文字エンコーディング・改行コードに一括変換する方法を記す。

日本語のテキストファイルを扱っていると,Shift_JISやCP932,EUF-JPといった文字エンコーディングが混在していたり,改行コードにCR+LFが混ざっていたりして処理の問題となることがある。この問題を解消するためにディレクトリを再帰して全ファイルを指定した文字エンコーディング・改行コードに変換する。

文字エンコーディングと改行コードの変換にはnkfを使用する。以下に示す通りfindコマンドで現在ディレクトリから再帰的にファイルを列挙してnkfで変換する。最も汎用性が高いのでこの方法がおそらくベストだ。

find . -type f -exec nkf -w -Lu --overwrite {} \;

この例では,文字エンコーディング:UTF-8,改行コード:LFとなるようにnkfの変換オプションを指定している。findコマンドのオプションの-nameなどでさらに変換対象を絞ることも可能だ。

なお,処理対象ファイルが多い場合,以下に示すようにxargsコマンドで検索対象をnkfに引き渡したほうが処理を高速にできる。

find . -type f | xargs nkf -w -Lu --overwrite {} \;

また,zshとbash4以降で導入されたglobstarという機能を使えば,短く書ける。

nkf -w -Lu --overwrite **/*.py

特定ディレクトリやファイルを避けたければ以下のようにして除外する。

nkf -w -Lu --overwrite **/!(.|..)

しかし,globstarを使うやり方(**/*)だとディレクトリに対してnkfを実行することがありえ,.nkftmp*というような不要なファイルが生成されてしまう。したがって,最初に示したfindコマンドを使う方法がよい。

参考:

  • nkfを使って、ディレクトリ以下のファイルを「EUC-JP」⇒「UTF-8」に一括変換する。 - カサヒラボ http://d.hatena.ne.jp/kasahi/20070926/1190833699
  • 文字コードの変換 – 片っ端からメモってみる http://www.parlia.net/weblog/post/722.html/

0 件のコメント:

コメントを投稿