奇怪的是,你的代码应该做你想要的事情。
在标量上下文中像<*.JPG>
这样的文件通配符将返回与模式匹配的下一个文件,由于while
和rename
都适用于标量上下文,所以这两个文件通配符在每次迭代时返回相同的值。
while (<*.JPG>) {
s/JPG$/jpg/;
rename <*.jpg>, $_;
}
循环的第一次迭代中,while
会将$_
设置为IMG_0178.JPG
,替换操作将文件类型设置为小写。
然后在重命名时,<*.jpg>
以标量上下文执行,并再次返回IMG_0178.JPG
- 在同一列表中的第一个文件,因为Windows文件名不区分大小写。
所以最后的重命名操作执行了rename 'IMG_0178.JPG', 'IMG_0178.jpg'
,符合要求。
将rename
重写成这样可以清楚地显示这一点:
sub ren($$) {
print "$_[0] -> $_[1]\n";
}
while (my $file = <*.JPG>) {
$file =~ s/JPG$/jpg/;
ren <*.JPG>, $file;
}
输出
IMG_0178.JPG -> IMG_0178.jpg
IMG_0182.JPG -> IMG_0182.jpg
IMG_0183.JPG -> IMG_0183.jpg
IMG_0184.JPG -> IMG_0184.jpg
IMG_0186.JPG -> IMG_0186.jpg
所以您很幸运,您的文件应该已按您想要的方式重命名了。
但是不要这样做。特别是,应该在任何关键操作的位置使用打印语句来运行程序,以便您可以看到即将发生的情况。
这样做会更好,因为id更清楚地表达了意图。
perl -e '($f = $_) =~ s/JPG$/jpg/i and rename $_, $f while <*.JPG>'
rename <*.jpg>
?在我的例子中,文件被删除了吗?再次感谢。 - cjd143SD<*.jpg>
没有匹配到任何内容。我尝试使用<*.JPG>
代替,它可以工作,但正如我之前告诉过你的,我更喜欢使用标量的rename
命令。 - Birei