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
つ find . -name '*.php' | xargs nkf -Sw --overwrite
by marucc at 2009-02-03 00:35:12
さて、寝よ。
追記
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
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
んー おもしろい