renameコマンドの謎

よく混乱の元になっているわけなんだけど、Debian系のrenameコマンドはutil-linuxのrenameとPerlのパッケージに含まれるrename(Debianのスクリプトによりprenameに改名後インストールされる)とでalternativeが指定できるようになっている。

つまり、

% /usr/sbin/update-alternatives --list rename
/usr/bin/prename

そして、

% dpkg -L util-linux perl | grep "rename"
/usr/bin/rename.ul
/usr/share/man/man1/rename.ul.1.gz
/usr/bin/prename
/usr/lib/perl/5.8.8/auto/POSIX/rename.al
/usr/share/man/man1/prename.1.gz

こんなのalternativeじゃないよ!!やめときゃいいのに!!

で、なんでこんなことを調べたかというと、次の小技がどのディストロで使えるかを知っておくためだったのだけど、prenameは Debian のパッケージメンテナが独自にパッケージ生成時に追加したスクリプトだったようだ。つまり、File::Renameを使うのがポータブルってことか。無念。

ファイル名のエンコーディングを直す

/usr/bin/prename の use strict の次の行に use Encode を追加しておき、

% rename 's/\(([0-9a-fA-F]{4})\)/decode("UCS-2", pack("H4", "$1"))/ge' [ファイル名]

こんな感じで。上の例はGripの設定を「Replace incompatible characters by hexadecimal numbers」にしたときに作られるファイル名を元通りに直すものだ。