我的代码如下所示:
#!/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++ }
感谢大家的帮助。
答案 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