/ / Налагодження одноклавіатури 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

Незвичайно ваш код повинен робити те, що ви хотіли.

Файл glob, як <*.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>"