Як використовувати команду перейменування в Linux

Пориньте у світ ефективного перейменування файлів в операційній системі Linux і дайте команді mv — і собі — перепочити. Процес перейменування здатний бути гнучким, швидким, а часом навіть простішим. Нижче представлено посібник з використання цієї потужної команди.

Що не так із командою mv?

Насправді, з командою mv все гаразд. Вона виконує свою роботу добре і доступна у всіх дистрибутивах Linux, macOS та інших Unix-подібних операційних системах. Це означає, що вона завжди під рукою. Проте, іноді вам потрібен не просто інструмент, а справжній “бульдозер”.

Команда mv має чітке призначення – переміщення файлів. Здатність переміщувати існуючий файл до нового файлу з новим ім’ям є скоріше “побічним ефектом”. Основна її функція – переміщення, хоча для нас, часто, вона виконує роль перейменування. Отже, ми отримуємо бажаний результат, але mv не є спеціалізованим інструментом для перейменування файлів.

Перейменування окремого файлу за допомогою mv

Щоб перейменувати файл за допомогою команди mv, введіть mv, потім пробіл, далі ім’я поточного файлу, знову пробіл і ім’я, яке ви хочете надати файлу. Після цього натисніть клавішу Enter.

Ви можете скористатися командою ls для перевірки, чи файл було перейменовано.

mv oldfile.txt newfile.txt
ls *.txt

Перейменування декількох файлів за допомогою mv

Ситуація ускладнюється, коли потрібно перейменувати кілька файлів одночасно. Команда mv не пристосована для обробки перейменування багатьох файлів. Вам доведеться вдатися до хитрощів з використанням Bash. Це може бути нескладно, якщо ви знайомі з командним рядком на середньому рівні, проте, складність перейменування багатьох файлів за допомогою mv різко контрастує з легкістю її використання для перейменування одного файлу.

З’являються додаткові труднощі.

Уявімо, що у нас є каталог із різними файлами різних типів. Деякі з них мають розширення “.prog”. Нам потрібно перейменувати їх в командному рядку, щоб вони мали розширення “.prg”.

Як ми можемо змусити mv зробити це за нас? Давайте подивимось на наші файли.

ls *.prog -l

Один зі способів це зробити (без написання фактичного скрипту Bash) виглядає так:

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

Чи спрацювало? Перевіримо файли, щоб переконатися.

ls *.pr*

Отже, так, все спрацювало. Тепер усі файли мають розширення “.prg”, а файлів з розширенням “.prog” у каталозі більше немає.

Що відбулося щойно?

Що саме зробила ця довга команда? Розберемо її по частинах.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

Перша частина запускає цикл, який послідовно обробляє кожен файл з розширенням “.prog” у каталозі.

Наступна частина визначає, що саме буде виконуватися під час обробки. Вона використовує mv для переміщення кожного файлу до нового. Новий файл отримує ім’я оригінального файлу, але без частини “.prog”. Замість неї додається нове розширення “.prg”.

Має бути простіший спосіб

Напевно. І він існує – це команда перейменування.

Команда rename не є стандартною частиною дистрибутиву Linux, тому вам потрібно буде встановити її. Вона може мати різні назви в різних Linux-сімействах, проте, принцип роботи завжди однаковий. Вам просто потрібно буде замінити команду на відповідну, залежно від дистрибутиву Linux, який ви використовуєте.

В дистрибутивах Ubuntu і Debian ви можете встановити rename наступним чином:

sudo apt-get install rename

В дистрибутивах Fedora і RedHat, ви можете встановити команду, як показано нижче. Зверніть увагу на початкову літеру «p», яка вказує на Perl.

sudo dnf install prename

Щоб встановити її в Manjaro Linux, використовуйте цю команду. Зверніть увагу, що команда rename називається perl-rename.

sudo pacman -Syu perl-rename

Спробуємо ще раз

Цього разу скористаємося командою rename. Повернемося до початкового набору файлів з розширенням “.prog”.

ls *.prog

Тепер скористаємося наступною командою для перейменування. Потім за допомогою ls перевіримо, чи все спрацювало. Пам’ятайте, що потрібно замінити команду rename на відповідну для вашого дистрибутиву Linux, якщо ви не використовуєте Ubuntu чи Debian.

rename 's/.prog/.prg/' *.prog
ls *.pr*

Все спрацювало, всі файли тепер мають розширення “.prg” і файлів з розширенням “.prog” у каталозі не залишилося.

Що відбулося цього разу?

Пояснимо цю магію у трьох частинах.

Перша частина – це ім’я команди, rename (або prename, або perl-rename для інших дистрибутивів).

Остання частина — *.prog, яка вказує rename працювати з усіма файлами, що мають розширення “.prog”.

Середня частина визначає операцію, яку ми хочемо виконати з кожним ім’ям файлу. “s” означає заміну. Перший термін (.prog) – це те, що rename буде шукати в кожному імені файлу, а другий термін (.prg) – це те, на що його потрібно замінити.

Середня частина команди, або центральний вираз – це ‘ регулярний вираз ‘ Perl і саме це робить команду rename такою гнучкою.

Зміна інших частин імені файлу

Ми вже змінили розширення імен файлів. Тепер виправимо інші частини.

У нашому каталозі є багато файлів вихідного коду C. Усі імена файлів починаються з префікса “slang_”. Перевіримо це за допомогою команди ls.

ls sl*.c

Ми збираємось замінити всі входження “slang_” на “sl_”. Формат команди нам вже знайомий. Ми просто змінюємо пошуковий термін, термін заміни і тип файлу.

rename 's/slang_/sl_' *.c

Цього разу ми шукаємо файли з розширенням “.c” і слово “slang_”. Щоразу, коли в імені файлу зустрічається “slang_”, воно замінюється на “sl_”.

Можемо перевірити результат цієї команди, повторивши команду ls з тими ж параметрами:

ls sl*.c

Видалення частини імені файлу

Ми можемо видалити частину імені файлу, замінивши пошуковий термін нічим.

ls *.c
rename 's/sl_//' *.c
ls *.c

З виводу команди ls ми бачимо, що всі наші файли з розширенням “.c” починалися з префікса “sl_”. Давайте позбавимося від нього взагалі.

Команда rename має такий же формат, як і раніше. Ми будемо шукати файли з розширенням “.c”. Пошуковим терміном є “sl_”, а терміну заміни немає. Дві косі риски без нічого між ними означають порожній рядок.

rename буде обробляти кожен файл з розширенням “.c” по черзі. Він буде шукати “sl_” в імені файлу. Якщо він знайдений, він не буде замінений нічим. Іншими словами, пошуковий термін видаляється.

Другий виклик команди ls підтверджує, що префікс “sl_” було видалено з кожного файлу з розширенням “.c”.

Обмеження змін до певних частин імені файлу

Використаємо ls для перегляду файлів, в іменах яких є рядок “param”. Потім використаємо rename, щоб замінити цей рядок на “parameter”. Знову ж таки, використаємо ls, щоб побачити, як команда rename вплинула на ці файли.

ls *param*
rename 's/param/parameter' *.c
ls *param*

Знайдено чотири файли, в імені яких є “param”. param.c, param_one.c і param_two.c мають “param” на початку свого імені. third_param.c має “param” наприкінці свого імені, прямо перед розширенням.

Команда rename буде шукати “param” у будь-якій частині імені файлу і замінювати його на “parameter” у всіх випадках.

Другий виклик ls показує нам, що саме так і сталося. Незалежно від того, чи був “param” на початку чи в кінці імені файлу, він був замінений на “parameter”.

Ми можемо використовувати метасимволи Perl для уточнення поведінки середнього виразу. Метасимволи – це символи, які представляють позиції або послідовності символів. Наприклад, ^ означає “початок рядка”, $ означає “кінець рядка”, а . означає будь-який окремий символ (крім символу нового рядка).

Ми збираємося використовувати метасимвол початку рядка ( ^ ), щоб обмежити наш пошук початком імені файлів.

ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

Файли, які ми перейменували раніше, перераховані, і ми бачимо, що рядок “parameter” знаходиться на початку трьох імен файлів і в кінці одного з імен.

Наша команда rename використовує метасимвол початку рядка (^) перед пошуковим терміном “parameter”. Це вказує rename вважати пошуковий термін знайденим, тільки якщо він знаходиться на початку імені файлу. Рядок пошуку “parameter” буде ігноруватися, якщо він знаходиться десь в іншому місці імені файлу.

Перевіряючи за допомогою ls, ми бачимо, що ім’я файлу, яке містило “parameter” наприкінці імені файлу, не було змінено. Але три імені файлів, які містили “parameter” на початку свого імені, мали рядок пошуку замінений на термін “value”.

Сила rename полягає в силі Perl. Вся потужність Perl у вашому розпорядженні.

Пошук з використанням груп

rename має ще деякі хитрощі в рукаві. Розглянемо випадок, коли у вас можуть бути файли зі схожими рядками в іменах. Це не зовсім однакові рядки, тому просте “пошук і заміна” тут не підходить.

У цьому прикладі ми використовуємо ls, щоб перевірити, які файли починаються з “str”. Їх два: string.c та strangle.c. Ми можемо перейменувати обидва рядки одночасно, використовуючи техніку, яка називається групуванням.

Центральний вираз цієї команди rename шукатиме рядки в іменах файлів, які мають послідовність символів “stri” або “stra”, де після цих послідовностей відразу йде “ng”. Іншими словами, наш пошуковий термін буде шукати “string” та “strang”. Терміном заміни буде “bang”.

ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

Другий виклик команди ls підтверджує, що string.c став bang.c, а strangle.c тепер є bangle.c.

Використання перекладів з командою rename

Команда rename може виконувати дії над іменами файлів, які називаються перекладами. Простим прикладом перекладу може бути перетворення всіх імен файлів у верхній регістр.

У наведеній нижче команді rename зверніть увагу, що ми не використовуємо s/ на початку центрального виразу, а використовуємо y/. Це повідомляє rename, що ми не виконуємо заміну; ми виконуємо переклад.

Термін az є виразом Perl, що означає всі символи нижнього регістру в послідовності від a до z. Аналогічно, термін AZ представляє всі великі літери в послідовності від A до Z.

Центральний вираз у цій команді можна перефразувати так: “якщо в імені файлу знайдено будь-яку з малих літер від a до z, замініть їх відповідними символами з послідовності символів верхнього регістру від A до Z”.

Щоб усі імена файлів з розширенням “.prg” стали верхнім регістром, використовуйте таку команду:

rename ‘y/az/AZ/’ *.prg

ls *.PRG

Команда ls показує нам, що всі імена файлів з розширенням “.prg” тепер записані великими літерами. Насправді, якщо бути точним, це більше не файли з розширенням “.prg”. Це файли з розширенням “.PRG”. Linux чутливий до регістру.

Ми можемо змінити цю останню команду, помінявши місцями члени az і AZ у центральному виразі.

rename ‘y/AZ/az/’ *.PRG

ls *.prg

Ви (не|не) вивчите Perl за п’ять хвилин

Ознайомлення з Perl вимагає часу. Однак, щоб почати використовувати можливості команди rename і економити час, вам зовсім не потрібно мати глибоких знань Perl. Ви отримаєте значні переваги у швидкості, простоті та економії часу.