Perlでファイル名一括置換処理を書いてみよう

やあ子どもたち。今日はPerlを使って沢山あるファイルのファイル名を一定ルールにもとづいて一括バッチ置換処理するためのスクリプト記述についてのメモだよ自分用にな。
pdbXXXX.ent という形式で名前のついたファイルがいくつもたくさんある状況で、これを、XXXX.pdb というファイル名に置換しようとする状況を想定します。
今回はちょっとPerlスクリプトを使ってやってみます。OSXのコンソールではいつでもPerlが気軽に使えます。ソースを以下に示そう。

#!/usr/bin/perl
my $num=0;
foreach (@ARGV)
{
        if( $_=~/.ent/ )
        {
          my $s0=$_;
          ~s/pdb//g;
          ~s/.ent/.pdb/g;
          print $s0."-->".$_."\n";
          rename( $s0, $_ );
          $num++;
        }       
}
print "total ".$num." files.\n";

使い方は、本スクリプトを例えばrename.pl みたいな名前で保存しておき、
chmod +x rename.pl
とやってこれを実行可能形式にした上で、
./rename.pl /*.ent
とでもやればよいのだ。とても便利だねこれは。
それでは内容について見ていこうか。
UNIXのシェルにおいては、そのコマンドライン引数に正規表現を使った場合、マッチするファイル名を探してきては引数リストARGVに順次追加していくという動作となります。ですからまずは上記ソースにあるように、@ARGVについてループを回してやることで、$_に各ファイル名が入るので、これを各々処理してやればよい。
処理の内容ですが、.entファイルであれば、先頭の要らないpdbを空文字ファイに置換して、さらに、.entという拡張子部分を、.pdbに置換してやります。そして、rename() というAPIを使って、ファイル名変更を実行しています。
Perlはあまり好きにはなれずにずっと敬遠してたのだけど今回先入観なしで勉強しなおしてみるとなかなかよいね。一番は、抽象化が高度にされていて文字数少な目で済むというのがよい。アルゴリズム的なものをこれで書くのはやっぱりないと思うが。