SJISファイルをutf8に変換するコマンド

とあるメッセージにレスをするために、コマンドを書いてみて、それをさすがにテストせずに発言するのには無責任すぎると思い、手元のMacでテストしてから発言しようと思った。


まずは、find関数。
普段、よく使うが、いざMac上で動かしてみたら動かない。

$ find ./ -name *.php
find: hoge.php: unknown option


あー、評価式は文字列か。ということで。

$ find ./ -name '*.php'
.//fuga.php
.//hoge.php

なんか変だ。


CentOS上で実行すると

$ find ./ -name '*.php'
./hoge.php
./fuga.php


そこで、./ ではなく、 . のみにすれば、うまくいくことがわかった。CentOSだけ使っていたら気にしなかった。

$ find . -name '*.php'
./fuga.php
./hoge.php

つぎに、nkf
案の定、Mac上には入っていなかった。
以前、MacPortsを入れていたので、yum感覚で、portsで入れてみた。

$ sudo port list | grep nkf
p5-nkf                         @2.08           perl/p5-nkf
nkf                            @2.0.8b         textproc/nkf
$ sudo port install nkf
--->  Fetching nkf
--->  Attempting to fetch nkf-2.0.8b.tar.gz from http://keihanna.dl.sourceforge.jp/nkf/26243/
--->  Verifying checksum(s) for nkf
--->  Extracting nkf
--->  Configuring nkf
--->  Building nkf
--->  Staging nkf into destroot
--->  Installing nkf 2.0.8b_0
--->  Activating nkf 2.0.8b_0
--->  Cleaning nkf
$ which nkf
/opt/local/bin/nkf


で、肝心のコマンドを、テストファイルを作って実行してみる。
vimで、SJISのファイルを作る場合には、空ファイルを作成後に、 :++enc=sjis コマンドを使い、その後に日本語を入力すれば、作ることが出来る。


後は、テストを実行してみる。

$ find . -name '*.php' | xargs nkf -Sw --overwrite


後処理としては、nkfにかけただけだと、ファイルの更新時間が変更されない。
svnなどでバージョン管理している場合には、touch を実行してあげる必要がある。
参考:変更したのに svn status に出てこない場合の対処 - maru.cc@はてな


まぁ、結局はネタでレスしようと思っただけなんですけどね。

Shift_JISでかかれたソースコードをどうしてくれようか考え中。
by 個々一番 at 2009-02-03(Tue) 00:15:55

http://wassr.jp/user/cocoiti/statuses/5d2LlFzWGS

つ find . -name '*.php' | xargs nkf -Sw --overwrite
by marucc at 2009-02-03 00:35:12

http://wassr.jp/user/marucc/statuses/6qv8WUfPIE


さて、寝よ。

追記

ELFさんのレスもあった

find -name \*.php | xargs php -r '$argv = $_SERVER['argv']; array_pop($argv); foreach($argv as $name) { var_dump($name); file_put_contents($name, mb_convert_encoding(file_get_contents($name), "UTF-8", "SJIS-WIN"));}'
by Tadashi "ELF" Jokagi at 2009-02-03(Tue) 00:41:55

http://wassr.jp/user/elf2000/statuses/w1OoZoUZ3v


CentOSで実行すると

$ find -name \*.php | xargs php -r '$argv = $_SERVER['argv']; array_pop($argv); foreach($argv as $name) { var_dump($name); file_put_contents($name, mb_convert_encoding(file_get_contents($name), "UTF-8", "SJIS-WIN"));}'
string(1) "-"
string(10) "./hoge.php"


Mac上で動かすと

$ find -name \*.php | xargs php -r '$argv = $_SERVER['argv']; array_pop($argv); foreach($argv as $name) { var_dump($name); file_put_contents($name, mb_convert_encoding(file_get_contents($name), "UTF-8", "SJIS-WIN"));}'
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.php: No such file or directory


んー おもしろい