$dir = "/home/naveen/mp3tag/testfolder";
opendir(DMP3, $dir) || die("Cannot open directory");
@files= readdir(DMP3;
foreach $f (@files)
{
unless ( ($f eq ".") || ($f eq "..") )
{
$oldfile = $f;
$newfile = $f;
$newfile =~ s/ /_/g;
print "Old file: $oldfile \t";
print "New file: $newfile";
print "\n";
rename ("$oldfile", "$newfile") or warn "Couldn't rename $oldfile to $newfile !\n";
}
}
我正在编写一个简单的程序,将下划线添加到现有文件中并重命名。这是我获得代码的程度。但是它无法重命名文件并给我一个警告,我不知道错误在哪里。
此外,当我在cmd行上尝试相同的行时,我收到以下错误信息。
$ rename Jacques\ Greene\ -\ Clark\ \(Original\ Mix\).mp3 JG - C.mp3
Bareword "mp3" not allowed while "strict subs" in use at (eval 1) line 1.
$ rename Jacques\ Greene\ -\ Clark\ \(Original\ Mix\) JG - C
Can't locate object method "Original" via package "Mix" (perhaps you forgot to load "Mix"?) at (eval 1) line 1.
答案 0 :(得分:2)
您正在尝试重命名所有目录中的文件,而不仅仅是一个文件。错误可能是很多事情,因为你没有提到它,我只能猜测。
我记得, rename
有点不稳定,使用File::Copy中的move
是更安全的选择。此外,您可能希望避免重命名目录。使用更直观的界面也可能不是一个坏主意。
你最大的一个错误就是没有使用use strict; use warnings;
。通过将这些问题留给自己带来的麻烦不容小觑。
use strict;
use warnings;
use File::Copy qw(move);
for (@ARGV) {
my $org = $_;
tr/ /_/;
move($org, $_) or warn "Couldn't move $org to $_: $!";
}
用法:
perl script.pl /home/naveen/mp3tag/testfolder/*.mp3
所以,只要你给一个正确的glob作为参数,你的脚本只会影响那些文件。您可以添加更多检查以使其更严格。
如果您的命令行尝试是使用/ usr / bin / rename中的工具,我会冒险猜测您的错误可以通过使用引号来避免。
答案 1 :(得分:1)
这个工作示例可能会有所帮助
use strict;
use warnings;
use File::Copy;
my $dir = '/home/naveen/mp3tag/testfolder';
my @mp3s = glob ("$dir/*.mp3");
for my $mp3 (@mp3s) {
my $new_mp3 = $mp3;
$new_mp3 =~ s/\s/_/g;
move($mp3, $new_mp3);
}
答案 2 :(得分:0)
您正在rename
中呼叫/usr/bin
。如果要调用程序,请为其选择更好的名称,或者使用指定的完整路径调用它。
但在此之前,请至少将缺少的右括号添加到readdir
。