ディレクトリ名・ファイル名の文字コードを再帰的に変更する

日付 2019.06.12
タイトル ディレクトリ名・ファイル名の文字コードを再帰的に変更する
本文
convmvを使えない場合の変換方法。
xargsを使うとsjisは文字化けしてしまうのでsedで実行コマンドを作成する。

# utf-8 → shift_jis変換
find . | \
awk '/^.\// { c = split($0, a, "/"); print c "\t" $0 }' | \
sort -nr -k1 | \
awk '{print $2}' | \
sed 's|\(.*\)|echo \1"\t"`dirname \1`"/"`basename \1 \| iconv -f utf8 -t sjis -c `|' | \
sh - | \
awk '$1 != $2 { print "mv -n " "\"" $1 "\"", "\"" $2 "\"" }' | \
sh -


# shift_jis → utf-8変換
# shift_jisロケールで実行
# バックスラッシュと円マークの違いに注意
find . | ¥
awk '/^.¥// { c = split($0, a, "/"); print c "¥t" $0}' | ¥
sort -nr -k1 | ¥
awk '{print $2}' | ¥
sed 's|¥(.*¥)|echo ¥1"¥t"`dirname ¥1`"/"`basename ¥1 ¥| iconv -f sjis -t utf-8 -c `|' | ¥
sh - | ¥
awk '$1 != $2 { print "mv -n " "¥"" $1 "¥"", " " "¥"" $2 "¥"" }' | ¥
sh -

#
# sjisロケールが設定されていない場合
#
# RedHat EL 8の場合、glibc-locale-sourceが必要(なければ以下でインストール)
yum install glibc-locale-source

# sjis文字マップ作成(エラーが出るが一旦無視)
localedef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.sjis

# テスト
export LC_ALL=ja_JP.sjis