2012-04-21 55 views
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行中的文件时出错

此外,当我在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

此程序将不会重命名* A *文件,它会在目录重命名*所有*文件。另外,“给我一个警告”......为什么你不提这个警告是什么? – TLP 2012-04-21 14:32:04

+0

那么警告是警告消息,我得到它不能重命名。 cmd行上的其他错误消息列在cmd本身下。 – Naveen 2012-04-21 14:55:23

+2

您应该在警告中包含'$!'以查看实际错误。 – TLP 2012-04-21 15:04:36

回答

2

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

rename正如我记得的那样,有点不习惯,并使用move from 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 

所以,只要你给一个适当的水珠作为参数,脚本只会影响那些文件。您可以添加更多检查以使其更严格。

如果您的命令行尝试是使用/ usr/bin/rename中的工具,那么我会冒险猜测您的错误可以通过使用引号来避免。

0

要调用的/usr/binrename。如果您想调用您的程序,请为其选择一个更好的名称,或者使用指定的完整路径调用它。

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

+0

对不起,我实际上是在做目录中的所有文件。警告是警告信息,我得到它不能重命名。cmd行上的其他错误信息列在cmd本身下。我做了关于重命名的研究,几乎每个人似乎都知道它是正确的。在cmd行上也是如此(参见我的代码的第二部分)除了我甚至将我的文件权限更改为777. – Naveen 2012-04-21 14:58:07

+1

我可能还不够清楚:你不打电话给你的程序,你打电话给另一个。 – choroba 2012-04-21 16:46:19

+0

丢失的支架是一个错字,但我想到了这一点,我必须传递路径值和文件一起删除它,它的工作和它的一切都很好,谢谢。 – Naveen 2012-04-23 16:23:49

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); 
}