Як використовувати команду перейменування в 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 різко контрастує з простотою використання mv для перейменування одного файлу.

Справи швидко загострюються.

Скажімо, у нас є каталог із різними файлами різних типів. Деякі з цих файлів мають розширення «.prog». Ми хочемо перейменувати їх у командному рядку, щоб вони мали розширення «.prg».

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

ls *.prog -l

Ось один із способів зробити це, який не вдається до написання фактичного файлу сценарію Bash.

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

для f у *.prog;  робити mv --

Це спрацювало? Давайте перевіримо файли і подивимося.

ls *.pr*

Отже, так, це спрацювало. Зараз усі файли «.prg», а в каталозі немає файлів «.prog».

Що щойно трапилося?

Що насправді зробила ця довга команда? Давайте розберемо його.

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

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

  Як увімкнути вхід Root SSH в Linux

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

Повинен бути простіший шлях

Напевно. Це команда перейменування.

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

у дистрибутивах Ubuntu та Debian ви встановлюєте перейменування таким чином:

sudo apt-get install rename

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

sudo dnf install prename

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

sudo pacman -Syu perl-rename

Зробимо це ще раз

І цього разу ми скористаємося перейменуванням. Ми повернемо час назад, щоб отримати набір файлів «.prog».

ls *.prog

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

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

Це спрацювало, тепер усі файли «.prg», і в каталозі не залишилося файлів «.prog».

Що трапилося цього разу?

Давайте пояснимо цю магію в трьох частинах.

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

Остання частина — *.prog, яка вказує перейменувати працювати з усіма файлами «.prog».

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

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

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

Наразі ми змінили розширення імен файлів, давайте виправимо інші частини імен файлів.

У каталозі багато файлів вихідного коду C. Усі імена файлів мають префікс «сленг_». Ми можемо перевірити це за допомогою 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_». Давайте позбудемося цього взагалі.

  Як налаштувати Firejail на Linux

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

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

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

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

Давайте використовувати ls для перегляду файлів, у назві яких є рядок «param». Потім ми використаємо перейменування, щоб замінити цей рядок на рядок «параметр». Ми ще раз використаємо ls, щоб побачити, як команда перейменування справила ці файли.

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

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

Команда перейменування буде шукати «param» скрізь у назві файлу і замінювати його на «параметр» у всіх випадках.

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

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

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

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

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

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

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

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

Пошук за допомогою груп

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

  Як встановити ZFS на Linux

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

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

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

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

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

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

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

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

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

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

перейменувати ‘y/az/AZ/’ *.prg

ls *.PRG

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

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

перейменувати ‘y/AZ/az/’ *.PRG

ls *.prg

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

На ознайомлення з Perl витрачений час. Але щоб почати використовувати можливості команди перейменування, що заощаджують час, вам зовсім не потрібно мати багато знань Perl, щоб отримати великі переваги в потужності, простоті та часі.