それで、WebサーバがMacであったとする。そのサーバから wget でまとめてファイルを取ってくると、wget は urlencode したものをファイル名にして保存するので、結局ファイル名は、urlencoded な UTF8-NFDということになる。つまり、何が何だかわからんファイル名がズラズラ並んで困る。
いちいち手で変換するのは気が遠くなるので、一括で変換してしまいたいが、ここからがいろいろと面倒で、
- CentOS5にバンドルされてる iconv/nkf は UTF8-NFD に対応していない
- ファイル名コード一括変換ができる 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 .
などとやれば、文字化けファイル名を一括変換。
▼レンタルサーバー・VPS比較表を見る▼