Зауважте, що ви використовуєте скрипт Perl, який називаєтьсяrename
розподіленим Debian та похідними (Ubuntu, Mint, ...). Інші дистрибутиви Linux постачають зовсім іншу і значно менш корисну команду rename
.
y/A-Z/a-z/
переводить кожен символ в діапазоні A
через Z
у відповідний символ в діапазоні a
через z
, тобто ASCII прописних літер у відповідній малої літери. Щоб виконати зворотний переклад, використовуйте y/a-z/A-Z/
. Інший спосіб написати ту ж команду , яка rename '$_ = uc($_)' *
- uc
це у PPER з функцією ази, а rename
команда перейменовує файли , заснована на перетворенні з до $_
змінному.
rename '…' *
лише перейменовує файли в поточному каталозі, тому що це *
відповідає. Файли з крапками (файли, ім'я яких починається з .
) теж пропускаються.
Якщо ви хочете перейменувати файли в поточному каталозі та в підкаталогах рекурсивно, ви можете скористатися find
командою для рекурсивного перегляду поточного каталогу. Тут є складнощі: якщо ви телефонуєте rename
, це перейменовує і каталог, і частину базового імені. Якщо ви закликаєте rename
до каталогу, перш ніж повторити його ( find -exec rename … {} \;
), find
заплутаєтесь, оскільки знайдений каталог, але цей каталог вже не існує до моменту, коли він намагається спуститися до нього. Ви можете подолати це, сказавши find
пройти каталог перед тим, як діяти на нього, але потім ви намагаєтесь перейменувати foo/bar
його, FOO/BAR
але каталог FOO
не існує.
Простий спосіб уникнути цієї складності - змусити команду перейменування діяти лише на базовій частині імені шляху. Регулярний вираз ([^/]*\Z)
відповідає кінцевій частині шляху, яка не містить /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Оболонка zsh надає більш зручні функції для перейменування - навіть більш виразні, ніж Perl, але складніше і часто простіше складати.
Функція zmv
перейменовує файли на основі шаблонів. Запустіть autoload -U zmv
один раз, щоб активувати його (покладіть цей рядок у своє .zshrc
).
У першому аргументі zmv
(шаблон, який потрібно замінити) ви можете використовувати потужні шаблони підстановки zsh . У другому аргументі zmv
(текст заміни) ви можете використовувати його функції розширення параметрів , включаючи модифікатори історії .
zmv -w '**/*' '$1$2:u'
Пояснення:
-w
- автоматичне призначення числових змінних кожному шаблону підстановки
**/*
- всі файли в підкаталогах, рекурсивно ( **/
відповідає 0, 1 або більше рівнів підкаталогів)
$1
- перша числова змінна, яка відповідає каталозі частини кожного шляху
$2:u
- друга числова змінна, яка відповідає базовій частині імені кожного шляху, з :u
модифікатором для перетворення значення у верхній регістр
Як додатковий бонус, це враховує параметри місцевого оточення.
Якщо ви не впевнені в zmv
написаній вами команді, ви можете пропустити -n
опцію надрукувати те, що виконувала б команда, і нічого не змінити. Перевірте висновок, і якщо він виконує те, що ви хочете, повторіть команду без -n
фактичного дії.
rename 'y/a-z/A-Z/' *
ви отримаєте те, що хочете. Обережно, де ви це протестуєте.