2010年12月25日

wgetで取ってきたMacのファイル名を一括で修正する

MacOSのファイル名は UTF-8 なんだが、Normalization Form D(NFD) というやつである。こいつはちょいと曲者で、LinuxやらWindowsやらの UTF-8 は Normalization Form C(NFC) なので、Macのファイル名をそのまま読もうとすると、「ケ゛ルハルト・ハ゛ルクホルン」みたいになってしまう。困る。
それで、WebサーバがMacであったとする。そのサーバから wget でまとめてファイルを取ってくると、wget は urlencode したものをファイル名にして保存するので、結局ファイル名は、urlencoded な UTF8-NFDということになる。つまり、何が何だかわからんファイル名がズラズラ並んで困る。

いちいち手で変換するのは気が遠くなるので、一括で変換してしまいたいが、ここからがいろいろと面倒で、
  1. CentOS5にバンドルされてる iconv/nkf は UTF8-NFD に対応していない
  2. ファイル名コード一括変換ができる convmv はNFD-NFC変換に対応しているが urldecode できない

ということで、どちらも帯に短したすきに長し。(convmvは標準では入ってないかもしれないが、Baseリポジトリにあるので、yum install convmvで一発)

どうすればいいかと思うと、結局、まずurlencodeされた名前を元の名前にmvして(UTF8-NFDのファイル名になる)、更に convmv で UTF8-NFC にしてやれば、めでたく解決するので、これを指定ディレクトリ以下一括でなんとかするスクリプトを書いた。


#!/bin/sh
# wgetname_nfd2nfc.sh

conv_recursive()
{
for fname in $1/*
do
newname=`echo ${fname}|nkf --url-input -w`
if [ "${fname}" != "${newname}" ]; then
mv "${fname}" "${newname}"
fname=${newname}
fi
if [ -d "${fname}" ] ; then
conv_recursive ${fname}
fi
done
return 1
}

if [ "$1" == "" ]; then
echo "Usage: $0 startdir"
exit
fi

conv_recursive $1
convmv -r -f utf8 --nfd -t utf8 --nfc --notest $1/*

第一引数に指定されたディレクトリ(末尾の/は不要)から下のディレクトリのファイル名をまとめて変換する。
これで

% wget --recursive http://ahoaho/hogehoge/
% wgetname_nfd2nfc.sh .

などとやれば、文字化けファイル名を一括変換。
posted by usoinfo at 16:17 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]