尝试重命名脚本和cmd行中的文件时出错

时间:2012-04-21 14:17:46

标签: perl bash

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

3 个答案:

答案 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