Поиск по сайту:

Как использовать команду переименования в Linux


Освойте мощную систему переименования файлов в мире Linux и дайте 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"; done

Это сработало? Давайте проверим файлы и посмотрим.

ls *.pr*

Так что да, это сработало. Теперь это все файлы «.prg», и в каталоге нет файлов «.prog».

Что сейчас произошло?

Что на самом деле делала эта длинная команда? Давайте сломаем это.

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

Первая часть запускает цикл, который будет обрабатывать каждый файл «.prog» в каталоге по очереди.

В следующей части рассказывается, что делает обработка. Он использует mv для перемещения каждого файла в новый файл. Новому файлу будет присвоено имя исходного файла, за исключением части «.prog». Вместо этого будет использоваться новое расширение «.prg».

Последняя часть завершает цикл после обработки каждого файла.

Должен быть более простой способ

Вероятнее всего. Это команда rename.

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

в Ubuntu и производных от Debian дистрибутивах вы устанавливаете rename следующим образом:

sudo apt-get install rename

В дистрибутивах, производных от Fedora и RedHat, вы устанавливаете prename следующим образом. Обратите внимание на начальную букву «p», обозначающую Perl.

sudo dnf install prename

Чтобы установить его в Manjaro Linux, используйте следующую команду. Обратите внимание, что команда переименования называется perl-rename.

sudo pacman -Syu perl-rename

Давайте сделаем это снова

И на этот раз мы будем использовать rename. Откатываем часы, чтобы у нас был набор файлов «.prog».

ls *.prog

Теперь давайте используем следующую команду, чтобы переименовать их. Затем мы проверим с помощью ls, сработало ли это. Не забудьте заменить rename соответствующим именем команды для вашего Linux, если вы не используете Ubuntu или Linux, производный от 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_». Всякий раз, когда в имени файла встречается «сленг_», он заменяется на «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, чтобы заменить эту строку строкой «параметр». Мы воспользуемся 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 будет искать «параметр» везде в имени файла и во всех случаях заменять его на «параметр».

Второе использование команды ls показывает нам, что именно это и произошло. Независимо от того, был ли «параметр» в начале или в конце имени файла, он был заменен на «параметр».

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

Мы собираемся использовать метасимвол начала строки ( ^ ), чтобы ограничить наш поиск началом имен файлов.

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

Файлы, которые мы переименовали ранее, перечислены, и мы видим, что строка «параметр» находится в начале трех имен файлов и в конце одного из имен файлов.

Наша команда rename использует метасимвол начала строки (^)  перед поисковым запросом parameter. Это говорит rename считать поисковый запрос найденным только в том случае, если он находится в начале имени файла. Строка поиска «параметр» будет игнорироваться, если она находится где-то еще в имени файла.

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

Сила rename заключается в силе Perl. Вся мощь Perl в вашем распоряжении.

Поиск по группам

У rename есть еще несколько хитростей в рукаве. Давайте рассмотрим случай, когда у вас могут быть файлы с похожими строками в именах. Это не совсем одинаковые строки, поэтому простой поиск и подстановка здесь не сработают.

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

Центральное выражение этой команды rename будет искать строки в именах файлов, которые имеют последовательность символов «stri» или «stra», где за этими последовательностями сразу следует «ng». Другими словами, наш поисковый запрос будет искать «string» и «strang». Термин замены - «взрыв».

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

Использование ls во второй раз подтверждает, что string.c стал bang.c, а strangle.c теперь bangle.c.

Использование переводов с переименованием

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

В приведенной ниже команде rename обратите внимание, что мы не используем s/ для запуска основного выражения, мы используем y/. Это говорит rename, что мы не выполняем замену; мы выполняем перевод.

Термин a-z – это выражение Perl, означающее все символы нижнего регистра в последовательности от a до z. Точно так же термин A–Z представляет все прописные буквы в последовательности от A до Z.

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

Чтобы заставить имена файлов всех файлов «.prg» быть в верхнем регистре, используйте эту команду:

переименовать ‘y/a-z/A-Z/’ *.prg

ls *.PRG

Команда ls показывает нам, что все имена файлов «.prg» теперь в верхнем регистре. На самом деле, если быть строго точным, это уже не файлы «.prg». Это файлы «.PRG». Linux чувствителен к регистру.

Мы можем изменить последнюю команду, поменяв местами термины a-z и A-Z в центральном выражении.

переименовать ‘y/A-Z/a-z/’ *.PRG

ls *.prg

Вы (ничего|не)учите Perl за пять минут

Чтобы разобраться с Perl, нужно время, потраченное с пользой. Но чтобы начать использовать экономящие время возможности команды rename, вам вовсе не обязательно иметь много знаний Perl, чтобы получить большие преимущества в мощности, простоте и времени.

RELATED: Best Linux Laptops for Developers and Enthusiasts