FrontPage


Counter: 3467, today: 1, yesterday: 1

最終更新 2013-10-06 (日) 13:03:16


htmlファイル名に「'」が含まれていると・・・ 2013年1月11日17:04

ファイル名が「who's-who.html」のように「'」が含まれていると、こんな風にエラーします。

blackcube# find . -type f -name '*.html' | xargs -n 10 nkf -s --overwrite
xargs: unterminated quote
blackcube# find . -type f -name '*.html' | xargs -n 10 nkf -s --overwrite
blackcube# find . -type f -name '*.html' -print0 | xargs -0 perl -i.bak -pe 's/iso-2022-jp/Shift_JIS/g'
blackcube# find . -name "*.bak" -exec rm {} \;

ついでに、.htm なファイルも面倒みておく

blackcube# find . -type f -name '*.htm' | xargs -n 10 nkf -s --overwrite
blackcube# find . -type f -name '*.htm' -print0 | xargs -0 perl -i.bak -pe 's/iso-2022-jp/Shift_JIS/g'
blackcube# find . -name "*.bak" -exec rm {} \;

nkf がインストールされていないと、

2013年1月11日  こういうエラーがでて、訳がわからなくなりますw

blackcube# find . -type f -name '*.html' | xargs -n 10 nkf -s --overwrite
xargs: unterminated quote
blackcube# find . -type f -name '*.html' | xargs nkf -s --overwrite
xargs: unterminated quote
blackcube#
blackcube# find . -type f -name '*.html' | xargs -0 nkf -s --overwrite
xargs: insufficient space for argument
blackcube#
blackcube# find . -type f -name '*.html' | xargs -0 -n 10 nkf -s --overwrite
xargs: insufficient space for argument
blackcube# find . -type f -name '*.html' | xargs -0 -n 5 nkf -s --overwrite
xargs: insufficient space for argument
blackcube#
blackcube#
blackcube# find . -type f -name '*.html' | xargs -n 10 nkf -s --overwrite
xargs: unterminated quote
blackcube# find . -type f -name '*.html' | xargs -n 10 -0 nkf -s --overwrite
xargs: insufficient space for argument
blackcube# find . -type f -name '*.html' | xargs -n 1 -0 nkf -s --overwrite
xargs: insufficient space for argument
blackcube#
blackcube#

safari では、文字化けする.htmlファイル

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。

.htmlなファイルだけコード変換して、ファイル内部の文字列も置換する

カレントディレクトリ以下のファイル群の一括変換のワンライナー

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 {} \;

カレントディレクトリ以下の全ファイルを Shift_JIS に変換する場合

但し、これだけだと、画像ファイルなども問答無用で適応される風なので、画像データがおかしくなるようです。

$ 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'

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS