我一直在尝试编写一个脚本来批量处理媒体文件列表,以便在其上使用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。
答案 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>