使用perl重命名文件

时间:2010-04-05 19:07:03

标签: perl path rename

我在perl中想要重命名的另一个文件夹中有一个文件,我之前看到的是一个解决方案,显示的内容如下:

#rename
for (<C:\\backup\\backup.rar>) {
    my $file = $_;
    my $new = $file . 'backup' . $ts . '.rar';  
    rename $file, $new or die "Error, can not rename $file as $new: $!";
}

但是backup.rar在不同的文件夹中,我确实尝试在&lt;&gt;中放入“C:\ backup \ backup.rar”上面,但我得到了同样的错误。

C:\Program Files\WinRAR>perl backup.pl
String found where operator expected at backup.pl line 35, near "$_ 'backup'"
        (Missing operator before 'backup'?)
syntax error at backup.pl line 35, near "$_ 'backup'"
Execution of backup.pl aborted due to compilation errors.

我正在使用

# Get time
my @test = POSIX::strftime("%m-%d-%Y--%H-%M-%S\n", localtime);
print @test;

要获取当前时间,但我似乎无法正确地将其发送到rename

我该怎么做才能解决这个问题?请注意我在窗户框上这样做。

4 个答案:

答案 0 :(得分:2)

注意实际的错误信息。看看这一行:

my $new = $_ 'backup'. @test .'.rar';

如果要将$_和数组@test的内容插入到这样的字符串中,则需要使用:

my $new = "${_}backup@test.rar";

但我很难理解这一点。

现在,strftime返回一个标量。为什么不使用:

my $ts = POSIX::strftime("%m-%d-%Y--%H-%M-%S", localtime);
my $new = sprintf '%s%s%s.rar', $_, backup => $ts;

顺便提一下,如果您先将时间戳设置为YYYYMMDD-HHMMSS并将其格式化为04-05-2010,那么最终可能会让您的生活更加简单,这样就不会混淆{{1}}所指的日期。

答案 1 :(得分:1)

该行

my $new = $_ 'backup'. @test .'.rar';

可能应该阅读

my $new = $file . 'backup' . @test . '.rar';

(你错过了一个连接运算符,使用该行中的命名变量比在那里重用$_更明确...)

答案 2 :(得分:0)

我想你错过了字符串concat符号。 (期间):

my $new = $_ 'backup'. @test .'.rar';

应该是

my $new = $_ . 'backup' . @test . '.rar';

答案 3 :(得分:0)

轻微的问题,但你不需要

for (<C:\\backup\\backup.rar>) {
   my $file = $_;
   .....
}

如果您正在扩展通配符,那么< >构造将非常有用,但您不是。 对这段代码的未来读者深思熟虑(你在一年之内!)并写下

my $file = 'C:\backup\backup.rar' ;

请注意不会扩展反斜杠的单引号。