奇妙なことに、あなたのコードはあなたが望むことをするはずです。
スカラーコンテキストのようなファイルグロブ<*.JPG>
は、パターンに一致する次のファイルを返します。両方ともスカラーコンテキストwhile
をrename
適用するため、2つのグロブは各反復で同じ値を返します。
while (<*.JPG>) {
s/JPG$/jpg/;
rename <*.jpg>, $_;
}
ループの最初の反復では、によって$_
設定さIMG_0178.JPG
れwhile
、置換によってファイルタイプが小文字に設定されます。
次に、名前変更<*.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
幸運なことに、ファイルの名前は必要に応じて変更する必要があります。
しかし、これをしないでください。特に、重要な操作の代わりにprintステートメントを使用してプログラムを実行し、何が起こるかを確認できるようにする必要があります。
idが意図したことをより明確に行うので、これはより良いでしょう
perl -e '($f = $_) =~ s/JPG$/jpg/i and rename $_, $f while <*.JPG>'