Тествах / изпробвах този Perl един-линеен, и се опитвам да разбера какво се е случило с файловете. Вече не виждам файловете. Изтрих ли ги или какво се обърка?
Пример за изброени имена на файлове (оригинал):
IMG_0178.JPG
IMG_0182.JPG
IMG_0183.JPG
IMG_0184.JPG
IMG_0186.JPG
Исках просто да променя разширението на файла на малка (.jpg):
perl -e"while(<*.JPG>) { s/JPG$/jpg/; rename <*.jpg>, $_ }"
Отговори:
9 за отговор № 1Не използвайте rename
с глобус. Използвайте скалари. Опитайте се да зададете името на файла на нова променлива преди замяната и да преименувате старото име на промененото, като това:
perl -e"while(<*.JPG>) { ($new = $_) =~ s/JPG$/jpg/; rename $_, $new }"
Проверете изхода с ls -1
:
IMG_0178.jpg
IMG_0182.jpg
IMG_0183.jpg
IMG_0184.jpg
IMG_0186.jpg
4 за отговор № 2
Странно, че вашият код трябва да направи това, което искате.
Файл със сферичен свят <*.JPG>
в скаларен контекст ще се върне следващия файл, който съответства на модела, и тъй като и двете while
и rename
прилагайте скаларен контекст, двете глобуси връщат една и съща стойност при всяка итерация.
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
Така че имате късмет и файловете ви трябва да са преименувани по ваш избор.
Но дон "т направите това. По-специално, трябва да стартирате програмата с изявление за печат на мястото на всяка критична операция, така че да можете да видите какво ще се случи.
Това би било по-добре, тъй като по-ясно се прави това, което е предназначено
perl -e "($f = $_) =~ s/JPG$/jpg/i and rename $_, $f while <*.JPG>"