无法使用File :: Basename将文件名拆分为名称和扩展名

时间:2014-06-01 04:32:04

标签: perl

我一直在尝试编写一个脚本来批量处理媒体文件列表,以便在其上使用avconv。

作为第一步,我将在路径上运行find,将文件列表导出到文件,然后使用它作为我的脚本的输入来运行每个命令。我尝试使用File :: Basename将每个文件名拆分为名称和扩展名。

我想出了这个看似简单的剧本:

#!/usr/bin/perl
use File::Basename;

while (<>) {
    chomp($_);
    my ($name,$path,$suffix) = fileparse($_);
    print "$name \t $suffix \n";
    #print "avconv -i $_ -c:v libx264 -c:a copy CONV-$i.mp4\n";
}

文件列表包含:

#cat input.txt
./Supernatural S01E01 HDTV.avi
./Supernatural S01E02 HDTV.avi
./Supernatural S01E03 HDTV.avi

我用:./process.pl input.txt运行它并得到:

#./process.pl input.txt
Supernatural S01E01 HDTV.avi
Supernatural S01E02 HDTV.avi
Supernatural S01E03 HDTV.avi

简而言之,$ suffix没有任何价值。

我在Debian 7 x64,perl v5.14.2。

2 个答案:

答案 0 :(得分:1)

您需要传递suffixlist参数。

my ($name,$path,$suffix) = fileparse($_, qr/\.[^.]*/);

答案 1 :(得分:0)

我将此作为答案发布,因为我认为它不会正确发布为评论。

@ikegami,

问题可能是我没有正确引用代码行。 IMO,SO以及PM没有用户友好的方式发布回复。我在FishMonger的用户名下发布了许多其他论坛,我在这里和PM上发布格式正确的评论和代码比其他论坛更难。

D:\test>type input.txt
./Supernatural S01E01 HDTV.avi
./Supernatural S01E02 HDTV.avi
./Supernatural S01E03 HDTV.avi

D:\test>type process.pl
#!/usr/bin/perl
use File::Basename;

while (<>) {
    chomp($_);
    my ($name,$path,$suffix) = fileparse($_, qr/\..+$/);
    print "<$path> \t <$name> \t <$suffix> \n";
}

D:\test>process.pl input.txt
<./>     <Supernatural S01E01 HDTV>      <.avi>
<./>     <Supernatural S01E02 HDTV>      <.avi>
<./>     <Supernatural S01E03 HDTV>      <.avi>