convmv: ファイル名の文字コードを変換する

convmv


以前、「ファイルの中身」の文字コードを変換する方法は紹介しましたが、稀に「ファイル名」の文字コードも変換したいことがあります。

これがローカルHDDのFAT領域にあるファイルだった場合は、FATのマウントオプションを変更すれば良いだけなのですが、ネットワーク経由で受け取ったファイルなど、そういうわけにはいかない場合も多いと思います。

このような時に便利なのは convmv コマンドです。

convmv が標準でインストールされるようなディストリビューションは無いと思いますが、オプションのパッケージとして準備されていることが多いです。Fedoraの場合、同名のパッケージがあるので以下のようにしてインストールします。

# yum install convmv

変換は iconv と似ていて*1、変換元の文字コードと変換後の文字コードを指定します。

$ convmv -f SHIFT_JIS -t UTF-8 ./*.txt
(ファイル名がSHIFT_JISの ./*.txt を全て
 UTF-8 のファイル名にする)

$ convmv -r -f SHIFT_JIS -t UTF-8 testdir/
(testdirの中身を全て再帰的に(-r)変換する)

ただし、これは危険なコマンドなので、いきなり実行されることはありません。上記のようにコマンドを打つと、「変換したらこうなります」という候補が表示されるだけです。 その表示を見て、それで問題が無いなら、今打ったコマンドに --notest オプションを付けて再度実行すれば、実際の変換が行なわれます。 もしくは、-iを始めから付けておけば、インタラクティブモードになり、実際に変換するかどうかの問い合わせが表示されます。

ちなみに、convmv にはおまけとして、URLエンコードされたファイル名をアンエスケープしたり、ファイル名の大文字小文字を揃えたりする変換機能も付いています。

$ convmv --unescape URL%20encoded%20file
(URL%20encoded%20file を URL encoded file に変換)

$ convmv --upper Test_File
$ convmv --lower Test_File
(それぞれ、TEST_FILE や test_file に変換)

いずれも地味に便利な機能なので、convmv は、インストールしておいて損は無いプログラムでしょう。

*1:というか、内部的には iconv を変換ライブラリとして使用しているのでしょうが。