Фатмавати Ахмад Заенури/Shutterstock.com
Познакомьтесь с мощным механизмом переименования файлов в мире Linux и дайте mv
– и себе – отдых. Rename
гибок, быстр, а иногда даже проще. Вот учебник для этой мощной команды.
- Что не так с mv?
- Переименование отдельного файла с помощью mv
- Переименование нескольких файлов с помощью mv
- Что сейчас произошло?
- Должен быть более простой путь
- Давайте сделаем это снова
- Что случилось в этот раз?
- Изменение других частей имени файла
- Удаление части имени файла
- Ограничить изменения для определенных частей имен файлов
- Поиск с группировками
- Использование переводов с переименованием
- Вы (Wo | Do) не изучаете Perl за пять минут
Что не так с mv?
В mv
нет ничего плохого. Команда отлично справляется со своей задачей, и ее можно найти во всех дистрибутивах Linux, в macOS и в других Unix-подобных операционных системах. Так что это всегда доступно. Но иногда вам нужен бульдозер, а не лопата.
Команда mv
имеет цель в жизни, то есть перемещать файлы. Приятным побочным эффектом является то, что его можно использовать для перемещения существующего файла в новый файл с новым именем. В результате мы переименовываем файл, и мы получаем то, что хотим. Но mv
не является специальным инструментом переименования файлов.
Переименование отдельного файла с помощью mv
Чтобы использовать mv
для переименования файла, введите mv
, пробел, имя файла, пробел и новое имя, которое вы хотите иметь в файле. Затем нажмите Enter.
Вы можете использовать ls
, чтобы проверить, что файл был переименован.
mv oldfile.txt newfile.txt
ls * .txt
Переименование нескольких файлов с помощью mv
Все становится сложнее, когда вы хотите переименовать несколько файлов. mv
не имеет возможности работать с переименованием нескольких файлов. Вы должны использовать некоторые изящные трюки Баша. Это хорошо, если вы знакомы с некоторыми средствами командной строки среднего класса, но сложность переименования нескольких файлов с помощью 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 rename
В дистрибутивах, производных от Fedora и RedHat, вы устанавливаете prename
следующим образом. Обратите внимание на начальный «р», который обозначает Perl.
sudo dnf install prename
Чтобы установить его в Manjaro Linux, используйте следующую команду. Обратите внимание, что команда переименования называется perl-rename
.
sudo pacman -Syu perl-rename
Давайте сделаем это снова
И на этот раз мы будем использовать rename
. Мы вернемся назад, чтобы у нас был набор файлов «.prog».
ls * .prog
Теперь давайте использовать следующую команду, чтобы переименовать их. Затем мы проверим ls
, работает ли он. Не забудьте заменить rename
на соответствующее имя команды для вашего Linux, если вы не используете Ubuntu или Linux на основе Debian.
переименуйте 's/.prog/.prg /' * .prog
ls * .pr *
Это сработало, теперь это все файлы «.prg», и в каталоге не осталось файлов «.prog».
Что случилось в этот раз?
Давайте объясним это волшебство в трех частях.
Часть first – это имя команды, rename
(или prename
или perl-rename
для других дистрибутивов) ,
последняя часть – это *. Prog
, которая сообщает rename
работать со всеми файлами «.prog».
Часть middle определяет работу, которую мы хотим выполнить с каждым именем файла. s
означает замену. Первый термин ( .prog
) – это то, что rename
будет искать в каждом имени файла, а второй термин ( .prg
) – это то, что будет заменен на.
Средняя часть команды, или центральное выражение, является регулярным выражением Perl, и именно это придает команде rename
свою гибкость.
Изменение других частей имени файла
Пока мы изменили расширения файлов, давайте изменим другие части имен файлов.
В каталоге много файлов с исходным кодом. Все имена файлов имеют префикс «slang_». Мы можем проверить это с помощью ls
.
ls sl * .c
Мы собираемся заменить все вхождения «slang_» на «sl_». Формат команды нам уже знаком. Мы просто меняем поисковый термин, заменяющий термин и тип файла.
переименуйте 's/slang_/sl_' * .c
На этот раз мы ищем файлы «.c» и ищем «slang_». Всякий раз, когда «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» в end своего имени, непосредственно перед расширением.
Команда rename
будет искать «param» везде в имени файла и заменять его «параметром» во всех случаях.
Второе использование команды ls
показывает нам, что именно это и произошло. Независимо от того, был ли «param» в начале или в конце имени файла, он был заменен «параметром».
Мы можем использовать метасимволы Perl для уточнения поведения среднего выражения. Метасимволы – это символы, которые представляют позиции или последовательности символов. Например, ^
означает «начало строки», $
означает «конец строки», а .
означает любой отдельный символ (кроме от символа новой строки).
Мы собираемся использовать метасимвол начала строки ( ^
), чтобы ограничить наш поиск началом имен файлов.
ls * param * .c
переименовать 's/^ параметр/значение /' * .c
ls * param * .c
ls value * .c
Перечислены файлы, которые мы переименовали ранее, и мы можем видеть строку «параметр» в начале трех имен файлов и в конце одного из имен файлов.
Наша команда rename
использует метасимвол начала строки (^
) перед поисковым термином «параметр». Это говорит rename
только о поисковом термине быть найденным, если оно находится в начале имени файла. Строка поиска «параметр» будет игнорироваться, если она находится где-либо еще в имени файла.
Проверяя ls
, мы видим, что имя файла с «параметром» в конце имени файла не было изменено, но три имени файла с «параметром» в начало в их именах строка поиска заменена заменой термина «значение».
Сила rename
заключается во власти Perl. Вся мощь Perl в вашем распоряжении.
Поиск с группировками
rename
имеет еще больше хитростей. Давайте рассмотрим случай, когда у вас могут быть файлы с похожими строками в их именах. Они не совсем одинаковые строки, поэтому простой поиск и замена здесь не сработают.
В этом примере мы используем ls
, чтобы проверить, какие файлы у нас есть, которые начинаются с «str». Есть два из них, string.c и strangle.c. Мы можем переименовать обе строки одновременно, используя технику, называемую группированием.
Центральное выражение этой команды rename
будет искать строки в именах файлов, которые имеют последовательность символов «stri» или «stra», где за этими последовательностями сразу следует «ng». Другими словами, наш поисковый термин будет искать «string» и «strang». Подстановочный термин – «взрыв».
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/a-z/A-Z /’ * .prg »
ls * .PRG
Команда ls
показывает нам, что все имена файлов «.prg» теперь в верхнем регистре. На самом деле, если быть точным, они больше не являются файлами «.prg». Это файлы «.PRG». Linux чувствителен к регистру.
Мы можем отменить эту последнюю команду, изменив положение терминов a-z
и A-Z
в центральном выражении.
переименуйте «y/A-Z/a-z /’ * .PRG »
ls * .prg
Вы (Wo | Do) не изучаете Perl за пять минут
Освоение Perl – хорошо проведенное время. Но чтобы начать использовать возможности экономии времени команды rename
, вам совсем не нужно много знать Perl, чтобы получить большие преимущества в мощности, простоте и времени.