使用perl重命名文件,文件被删除

时间:2012-10-19 19:48:31

标签: perl rename

我的代码如下所示:

#!/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 个答案:

答案 0 :(得分:5)

这一行:

my $new_name = "picture$i";

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

解决方法是在循环内移动赋值,一起跳过变量并执行

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

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

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

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

答案 1 :(得分:1)

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

在循环中更新$new_name

foreach my $old_name (@old_names)
{
    $new_name = "picture$i";
    ...
}

答案 2 :(得分: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++;
}

答案 3 :(得分:0)

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

rename 's/(.*).jpg/picture1_\1/' *.jpg