Я тестував / пробрався цей 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>"