/ / Отстраняване на грешки на Perl с един линей за преименуване на файлове - perl

Отстраняване на грешки на Perl еднолинеен за преименуване на файлове - perl

Тествах / изпробвах този 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>"