日本語ファイル名の文字コードを変換するスクリプト(Perl版)

追記:修正版をアップしました。
文字化けした全角ファイル名の文字コードを再帰的に変換するスクリプト - myhd


以前の記事のやり方だと、文字列と文字コードの組み合わせによっては上手く動かない(文字化けしたファイルのmvに失敗する)ことがわかったので、Perlで書き直しました。

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use File::Copy;
use Encode;
#use Encode::Guess;

my $target_dir = $ARGV[0];

find (\&convmv_euc_to_sjis, $target_dir);

sub convmv_euc_to_sjis() {
  # ファイルのみを対象とする場合
  # return unless (-f $_);

  # 変換前文字コードがEUC-JPのみを対象とする場合
  # my $enc = guess_encoding($_, qw/euc-jp shiftjis/);
  # my $enc_name = ref $enc ? $enc->name : $enc;
  # return unless ($enc_name eq 'euc-jp');

  my $str = $_;
  Encode::from_to($str, 'euc-jp', 'shiftjis');
  move $_, $str or die $!;
}

ただ、変換対象がディレクトリだと、中身へchdir(find関数は内部でchdirしながら処理している)するときにエラーとなってしまうため、対策を考え中。