此処はどこ?

ぼつぼつ呟くページ

Amazon MP3 のリネーム

自分は完全にCD世代、というか子供の頃はレコードだったのだが、流れに流されAmazonでMP3を買うようになった。

携帯だけでもよかったが、家のステレオでも聞きたいな、と思った矢先、ファイルをコピーできることを発見。ただ、ファイル名がなんだか不思議な命名規則

例:

BAND-MAID/Just_Bring_It/B01N2W94BO_(disc_1)_05_-_CROSS.mp3

意味不明のアルファベットと数字、たぶん複数ディスクのうちのいくつ目か、トラックNo、曲名、.mp3 こんな並びだろうか。聞くにはOKなのだが、家のステレオのプレイヤーには文字が多すぎて曲名が出てこない。

これを、トラックNo.と曲名にできたらいいのに。

すでに2GBほどダウンロードしており、いっぺんに変えられないかと思案していた。

 

そうだ、Perlだ。

 

もう20年前によくスクリプトを書いていたのだが、必死でググって書いてみたのが以下。ActivePerlでwindowsでやってみた。

 

#!/usr/bin/perl
use strict;
use warnings;

my @artlist=glob("\.\/*");
foreach my $artn  (@artlist){
  print $artn ."\n";
  if (-d $artn) {
    chdir($artn);
    my @alblist=glob("\.\/*");
    foreach my $albn (@alblist){
      print $artn.$albn."\n";
      if (-d $albn) {
        chdir($albn);
        my @songlist=glob("\.\/*.mp3");
        foreach my $songn (@songlist){
          print $songn."  ";
          if ($songn=~/(\_)(\d{2})(\_)(\-)(\_)(.*)(\.mp3$)/) {#正規表現でトラックNo以降にマッチ

#(_)(数字2文字)(_)(-)(_)(任意の文字0文字以上)(.mp3)でマッチする部分を拾う
            my $songnn=($2).($3).($6).($7); #マッチした部分から、トラックNo、アンダースコア、曲名、MP3の拡張子を拾い出しつなげる。
            print "-->".$songnn."\n";
            rename $songn,$songnn ; #名前変更。
          }else{
          print "\n";
          }
        }
        chdir("..\\");
      }
    }
    chdir("..\\");
  }
}

globでディレクトリ内を走査し名前を拾い上げ、各々のディレクトリを下っていくループがメインになってしまったが、肝はコメント部分。前述のファイル名構造に沿って正規表現を括弧で区切って書くことと、区切ってマッチした部分を切り出してつなげて新しいファイル名にするところ。

実行すると、先ほどのファイルは

/BAND-MAID/Just_Bring_It/05_CROSS.mp3

となり目的達成。

すぐ忘れるから備忘録として置いておく。