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

Разберитесь с мощной системой переименования файлов в мире Linux и mvотдохните - и вы сами. Renameгибко, быстро, а иногда и проще. Вот учебное пособие по этой мощной команде.

Что не так с мв?

В этом нет ничего плохого 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.

для f в * .prog; do mv - "$ f" "$ {f% .prog} .prg"

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

ls * .pr *

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

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

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

для f в * .prog; do mv - "$ f" "$ {f% .prog} .prg"

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

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

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

Определенно. Это renameкоманда.

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

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

sudo apt-get install переименовать

В дистрибутивах, производных от 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 или производный от Debian Linux.

переименовать '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_». Формат команды нам уже знаком. Мы просто меняем поисковый запрос, заменяющий термин и тип файла.

переименовать 's / slang_ / sl_' * .c

На этот раз мы ищем файлы «.c» и ищем «сленг_». Всякий раз, когда в имени файла встречается «slang_», оно заменяется на «sl_».

Мы можем проверить результат этой команды, повторив lsкоманду сверху с теми же параметрами:

ls sl * .c

Удаление части имени файла

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

ls * .c
переименовать 's / sl _ //' * .c
ls * .c

Из lsкоманды видно, что все наши файлы «.c» начинаются с «sl_». Давайте вообще от этого избавимся.

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

renameобработает каждый файл «.c» по очереди. Он будет искать «sl_» в имени файла. Если он будет найден, он ничем не заменится. Другими словами, поисковый запрос удаляется.

Второе использование lsкоманды подтверждает, что префикс «sl_» был удален из каждого файла «.c».

Ограничение изменений определенных частей имен файлов

Давайте ls посмотрим на файлы, в имени которых есть строка «param». Затем мы renameзаменим эту строку строкой «параметр». Мы еще lsраз воспользуемся этим, чтобы увидеть эффект, который renameкоманда оказала на эти файлы.

ls * param *
переименовать '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
переименовать 's / ^ параметр / значение /' * .c
ls * param * .c
ls значение * .c

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

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

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

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

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

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

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

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

ls str * .c
переименовать '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 / az / AZ /' * .prg

ls * .PRG

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

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

переименовать 'y / AZ / az /' * .PRG

ls * .prg

Вы (Wo | Do) не выучите Perl за пять минут

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