我正在尝试使用Perl和Regex批量重命名一堆文件。到目前为止,我已经能够更改大多数事情,但是在删除下划线时遇到了麻烦。我搜索并找到了几个示例,它们的语法都差不多,但由于某些原因,它对我不起作用。
以下是我的文件名的示例:
HP_1 1级Geology_Plan_1_400dpi.jpg
到目前为止,这是我的代码:
# Declare directory path
my $dir = './Georeferenced_Images.tri/TEST/';
# Initialization message
printf "Changing names...\n";
# Remove spaces
my @list = glob("$dir/*");
for (@list) {
my $orig = $_;
s/\s+//g;
move($orig, $_);
}
# Remove underscores
@list = glob("$dir/*");
for (@list) {
my $orig = $_;
s/_//g;
move($orig, $_);
}
代码的顶部删除空格。代码的第二部分不删除下划线。我玩过这些代码,如果我执行以下操作,它将起作用:
s/_Plan_//g;
如果我只是想删除下划线,那是行不通的。任何帮助都会很棒!
谢谢
答案 0 :(得分:2)
问题是您的目录名称包含下划线。因此,当您从$_
删除所有下划线时,请更改目录的名称,然后move()
会尝试将重命名的文件移到(大概)不存在的重命名目录中。>
一种解决方案是使用File::Basename将$_
拆分为目录名和文件名,并且仅更改文件名。
另一种解决方案是在调用$dir
之前将目录更改为glob()
(然后从传递给$dir/
的参数中删除glob()
)。
您可能已经看到问题所在,是检查了move()
的返回值并显示了相应的错误消息。
move($orig, $_)
or die "Could not move $orig to $_: $!";
还请注意,通过在调用$orig
之前打印出$_
和move()
,您可能会a)可能看到问题所在,并且b)意识到该问题无关使用Perl的字符串替换(如您所见,替换成功完成)。当然,这是基本的调试实践,至少可以避免(至少)您发布标题完全误导的问题:-)