1
$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.
4

3 回答 3

2

您正在尝试重命名目录中的所有文件,而不仅仅是一个文件。错误可能很多,因为你没有提到它,我只能猜测。

rename是,我记得,有点不稳定,使用movefrom File::Copy是一个更安全的选择。此外,您可能希望避免重命名目录。使用更直观的界面也可能不是一个坏主意。

您最大的错误之一是不使用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 中的工具,我会冒险猜测您的错误可以通过使用引号来避免。

于 2012-04-21T14:44:09.293 回答
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);
}
于 2012-04-22T07:58:48.347 回答
0

你在rename打电话/usr/bin。如果要调用程序,请为其选择更好的名称,或指定完整路径来调用它。

但在此之前,请至少将缺少的右括号添加到readdir.

于 2012-04-21T14:22:21.807 回答