-->
从网上下载的mp3文件的文件名命令方式各式各样,有的是数字命名,有的是拼音命名,平时用起来不是很方便。如果动手一个个的更改又太麻烦,下面的脚本通过模块MP3::Tag提取的歌曲和歌手标签来确定文件名。
前一段时间我将系统(fedora core 6 codepage:gb2312)中的mp3文件复制到移动硬盘(fat32)上,所有的中文文件名全乱了挂载t移动硬盘命令(mount -t vfat -o iocharset=cp936 /dev/sda1 /media)好象没错。
如:
[root@supersun music]# ls
125206413.mp3 new.pl ysdmh.mp3 实馨.睾.mp3
1997cmp-10holes-15.mp3 numb.mp3 一..mp3 小.咏.mp3
2005929152321527.mp3 OneStepCloser.mp3 一夜.mp3 慊?..mp3
65541180.mp3 ouruola.mp3 一夜.谢.mp3 殖.mp3
a papercut.mp3 业陌.一.mp3 水俸.mp3
BeyondTheHorizon.mp3 PointsOfAuthority.mp3 之..mp3 睾-寓.mp3
BreakTheHabit.mp3 porunacabez.mp3 值..mp3 硕要..mp3
Crawling.mp3 pushing_me_away.mp3 前..mp3 碌..mp3
delid3.mp3 ruguodeshi.mp3 卤一堑.mp3 职..mp3
faint.mp3 simpleid3.pl 同..mp3 蔚某.睾.mp3
HitTheFloor.mp3 somewhereIbelong.mp3 园芫.mp3 虏..mp3
id3iconv-0.2.1.jar tag.pl 坦..mp3 要薷.??.mp3
InThenEnd.mp3 te.pl 失.mp3 觳?.强.mp3
LyingFromYou.mp3 wget-log 女..mp3 魔.藕.mp3
mp3id3.pl xs.mp3 始..mp3
现在我们来运行脚本:
[root@supersun music]# for i in *.mp3 ;do ./tag.pl $i;done
生成的文件名如下:
[root@supersun music]# ls *.mp3
01papercut-linkinpark.mp3 今天你要嫁给我-陶?.mp3
04.兄弟-任贤齐.mp3 公主的魔法项链-张含韵.mp3
08.可以爱很久-张韶涵.mp3 六月的雨-胡歌.mp3
125206413.mp3 其实很爱你张韶涵-张韶涵.mp3
13.Numb-LinkinPark.mp3 卤一堑.mp3
1997cmp-10holes-15.mp3 同桌的你-老狼.mp3
2005929152321527.mp3 回来我的爱-阳一.mp3
65541180.mp3 大漠情人-凤凰传奇.mp3
BeyondTheHorizon.mp3 寓言-张韶涵.mp3
BreakingtheHabit-LinkinPark.mp3 开始懂了-孙燕姿.mp3
crawling-LinkinPark.mp3 欧若拉-张韶涵.mp3
delid3.mp3 死了都要爱-信乐团SHIN.mp3
faint.mp3 殖.mp3
HitTheFloor.mp3 爱上你这样的女人-张振宇.mp3
LyingFromYou-LinkinPark.mp3 狼爱上羊-汤潮.mp3
OneStepCloser.mp3 秋天不回来-www.6621.com-王强-6621.com.mp3
PointsofAuthority(CrystalM-LinkinPark.mp3 绗?涓?娆-??????.mp3
PorUnaCabeza-CarlosGardel.mp3 职..mp3
PushingMeAway-LinkinPark.mp3 胆小鬼-梁咏琪.mp3
SOMEWHEREIBELONG-LINKINPARK.mp3 虏..mp3
TheUntitled(IntheEnd)-LinkinPark.mp3 遗失的美好-张韶涵.mp3
一夜.mp3 隐形的翅膀-张韶涵.mp3
一夜.谢.mp3 香水百合-张韶涵.mp3
丁香花-唐磊.mp3
下面给出脚本内容:
[root@supersun music]# cat tag.pl
#!/usr/bin/perl -w
#tag.pl
#提取
use strict;
use MP3::Tag;
use Encode;
use Encode::CN;
my $file=shift;
print "----------------------------------------\n";
print "文件名:$file\n";
my $mp3=MP3::Tag->new("$file");
#检测mp3对象中的标签
$mp3->get_tags();
if(exists $mp3->{ID3v1}){
print "下面是ID3v1的信息:\n";
#操作ID3v1标签:
my $id3v1= $mp3->{ID3v1};
#下面注释掉的两行是演示使用单个标签时的用法,其他的方法自己可以查看模块的使用说时
# print "Title:",encode("gb2312",decode("gb2312",$id3v1->title)),"\n";
# print "Artist:",encode("gb2312",decode("gb2312",$id3v1->artist))."\n";
print "一次性获取标签:\n\n";
#下面进行字符编码的处理
my @tag_data=map encode ("gb2312",decode("gb2312",$_)),$id3v1->all();
#打印标签内容
print "歌名:\t$tag_data[0]\n";
print "歌手:\t$tag_data[1]\n";
print "专辑:\t$tag_data[2]\n";
print "年份:\t$tag_data[3]\n";
print "注释:\t$tag_data[4]\n";
print "曲目序号:\t$tag_data[5]\n";
print "流派:$tag_data[6]\n";
#去除空格及预防在进行mv操作时发生插值
$tag_data[0] =~ s/\s+//g;
$tag_data[0] = quotemeta"$tag_data[0]";
$tag_data[1] =~ s/\s+//g;
$tag_data[1] = quotemeta"$tag_data[1]";
`mv $file ${tag_data[0]}"-"${tag_data[1]}'.mp3'`;
}
#对于id3v2的标签暂时还未进行处理
if(exists $mp3->{ID3v2}){
print "下面是ID3v2的信息:\n";
}else{
}
$mp3->close();

发表评论