0

我的代码如下所示:

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";
my $new_name = "picture$i";

foreach my $old_name (@old_names) {
    rename($old_name, $new_name) or 
        die "Couldn't rename $old_name to $new_name: $!\n";
} continue { $i++ }

当我执行脚本时它会删除图片,我做错了什么?

编辑:

这对我有用。

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";


foreach my $old_name (@old_names) {

    my $new_name = "picture$i" . ".jpg";

    rename($old_name, "/root/pics/$new_name") or die "Couldn't rename $old_name to $new_name: $!\n";

} continue { $i++ }

感谢大家的帮助。

4

4 回答 4

5

这一行:

my $new_name = "picture$i";

在你的循环之外。因此它不会得到更新。因此,所有文件都被重命名为相同的名称,从而有效地删除了它们。

解决方案是将赋值移动到循环内,或者一起跳过变量并执行

rename($old_name, "picture$i") ...

出于打高尔夫球的目的,您还可以考虑

rename($old_name, "picture" . $i++) ...

您可能也有兴趣查看File::Copy,它是一个核心模块。

于 2012-10-19T19:50:43.620 回答
1

$new_name您已经在循环之外初始化了一次。即使你更新了$i,你也没有更新$new_name。因此,每个文件都被重命名为picture1(在当前目录中),并且除了最后一个文件之外的所有文件都将丢失。

$new_name在循环内更新:

foreach my $old_name (@old_names)
{
    $new_name = "picture$i";
    ...
}
于 2012-10-19T19:52:37.170 回答
0

尝试:

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";
my $new_name = "picture$i";

foreach my $old_name (@old_names)
{
    $new_name = "picture$i";
    rename($old_name, $new_name) or die "Could not rename $old_name to $new_name: $!\n";
    $i++;
}
于 2012-10-19T19:53:47.023 回答
0

也许你可以在 shell 中做(perl在后台使用):

rename 's/(.*).jpg/picture1_\1/' *.jpg
于 2012-10-19T19:57:20.967 回答