Я могу успешно использовать следующую команду, и я вполне уверен, что с этой командой можно создавать другие комбинации:
`rename 's/\.htm/\.html/' *.htm`
Однако я хочу узнать больше об этом, особенно о s
в нем , Они говорят, что это выражение Perl. Я не изучал язык программирования Perl, поэтому понятия не имею, почему существует такой аргумент 's/\.htm/\.html/'
. Не могли бы вы сказать мне, что это такое? Спасибо за чтение.
В общем rename
переименовывает имена файлов , предоставленные в соответствии с правилом, указанным в качестве первого аргумента команды. Имена файлов снабжены аргументами, следующими за первым.
Первый аргумент в примере команды (rename 's/\.htm/\.html/' *.htm
) имеет меховые части, где в этом случае /
является разделителем этих частей:
s/regexp/replacement/[flags]
s
команда означает замену: s/<old>/<new>/
. Сопоставьте регулярное выражение с содержимым пространства шаблона. Если найдено, замените соответствующую строку заменой.
Регулярное выражение, соответствующее строкам, которые следует заменить. В текущем случае это просто строка .htm
.
В большинстве регулярных выражений точка .
соответствует каждому символу. В этом случае мы хотим использовать точку буквально, поэтому нам нужно избежать ее особого значения, используя обратную косую черту \
(цитируя один символ).
Замена sting / regexp соответствует 2.
Флаг, который не представлен в текущем примере. Это может быть, например, флаг g
- применить замену ко всем совпадениям к регулярному выражению, а не только к первому. Предположим, у нас есть файл с именем my.htm-file.htm
:
Исходная команда rename 's/\.htm/\.html/' *.htm
переименует файл следующим образом: my.html-file.htm
. Посмотрите в нижней части ответа, как избежать этой проблемы.
При добавлении флага g
- rename 's/\.htm/\.html/g' *.htm
- новое имя файла будет: my.html-file.html
.
В соответствии с именами файлов: *
может представлять любое количество символов (включая ноль, другими словами, ноль или более символов). Оболочка расширит этот глобус и передаст соответствующие имена файлов в качестве отдельных аргументов rename
. Таким образом, *.htm
- будет соответствовать всем именам файлов в текущем пути, которые заканчиваются строкой .htm
. Например, если у вас есть 1.htm
, 2.htm
, 3.htm
, 4.htm
и 5.htm
, тогда rename 's/\.htm/\.html/' *.htm
передает точно такие же аргументы для переименования, что и для бега:
rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
Всю команду (rename 's/\.htm/\.html/' *.htm
) можно прочитать следующим образом:
rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">
Давайте вернемся к примеру, когда у нас есть файл с именем my.htm-file.htm
. Вероятно, мы хотим изменить последнюю часть имени файла, так называемое расширение после последней точки. Для этого мы должны изменить команду rename
следующим образом:
rename 's/\.htm$/\.html/' *.htm
Где знак $
соответствует концу строки и буквально означает «читать назад».
^
- Сопоставляет пустую строку в начале пространства шаблона, то есть то, что появляется после огибающей, должно появляться в начале пространства шаблона. ( читать больше )
^
действует как специальный символ только в начале регулярного выражения или подвыражения (то есть после\(
или\|
). Однако переносимые сценарии должны избегать^
в начале подвыражения, поскольку POSIX допускает реализации, которые рассматривают^
как обычный символ в этом контексте.
$
- Это то же самое, что и^
, но относится к концу пространства шаблона.$
также действует как специальный символ только в конце регулярного выражения или подвыражения (то есть до\)
или\|
), и его использование в конце подвыражения не переносимо.
Ссылки: