safariだと、
<head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="GENERATOR" content="Mozilla/4.7 [ja] (Macintosh; I; PPC) [Netscape]"> <title>健康相談窓口</title> </head>
は、OKだけど、
<HEAD> <TITLE>パーマ液・ヘアーカラー剤の毒性</TITLE> <META NAME="Author" CONTENT=""> <META NAME="GENERATOR" CONTENT="User-Agent: Mozilla/3.01Gold [ja] (Macintosh; I; PPC)"> </HEAD>
が化ける。
find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/META NAME="Author" CONTENT=""/meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/g'
でどうだろう?
Bareword found where operator expected at -e line 1, near "s/META NAME="Author" CONTENT=""/meta http-equiv="Content-Type" content="text/html" String found where operator expected at -e line 1, at end of line (Missing semicolon on previous line?) syntax error at -e line 1, near "s/META NAME="Author" CONTENT=""/meta http-equiv="Content-Type" content="text/html" Can't find string terminator '"' anywhere before EOF at -e line 1. blackcube:niihamai {68} %
ん~~~!? あ、そっか、「/」をエスケープせねば・・・ってことね。
find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/META NAME="Author" CONTENT=""/meta http-equiv="Content-Type" content="text\/html; charset=Shift_JIS"/g'
で、OK。
カレントディレクトリ以下のファイル群の一括変換のワンライナー
blackcube:niihamai {19} % find . -type f -name '*.html' | xargs -n 10 nkf -s --overwrite blackcube:niihamai {20} % find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/iso-2022-jp/Shift_JIS/g'
問題がないようなら、*.bak ファイルを消去
find . -name "*.bak" -exec rm {} \;
但し、これだけだと、画像ファイルなども問答無用で適応される風なので、画像データがおかしくなるようです。
$ find . -type f | xargs -n 10 nkf -s --overwrite
もしくは、
$ find . -type f -exec nkf -s --overwrite {} \;
http://masaoo.blogspot.com/2009/02/find-nkf-xargs.html
http://d.hatena.ne.jp/rx7/20090207/p2
$ find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/from/to/g' $ find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/iso-2022-jp/Shift_JIS/g'
findとperl+正規表現で。
上の例は、今いるカレントディレクトリ以下の全ての".html"ファイル内の"from"という文字列を全て"to"に置き換えるワンライナー。
変更が行われたファイルは全て".bak"という拡張子で元のファイルがバックアップされます。
# ちなみに、"-i"の後ろに拡張子を書かないと実行すると、バックアップは取られず書き換えられる。
ファイル名に空白文字が入る場合も考慮して、findに-print0オプションを付けて、xargs -0で受け取るようにしたけど、そんなパターンねーよ、って場合は、上記オプションは不要です。
blackcube:niihamai {20} % find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/iso-2022-jp/Shift_JIS/g'