Несколько выражений в утилите командной строки `rename`

507
Dmitry Kabanov

Я учусь использовать утилиту командной строки Unix rename(см., Например, https://www.tecmint.com/rename-multiple-files-in-linux/ ).

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

rename [ -e|-E perlexpr]*|perlexpr [ files ] 

Я пытаюсь сделать это на следующем искусственном примере. У меня есть каталог с файлами:

$ ls 01.php 02.php 03.php 

Я применяю два преобразования, используя один renameвызов:

rename -n -v -e "s/\.php$/\.htm/" "y/a-z/A-Z/" * 

Ожидаемое поведение таково:

$ ls 01.HTM 02.HTM 03.HTM 

Тем не менее, выходной сигнал renameявляется

rename(01.php, 01.htm) rename(02.php, 02.htm) rename(03.php, 03.htm) 

то есть второе преобразование (строчные буквы в верхние) не применяется.

Как объединить несколько выражений вместе?

0
Работа _should_ заключается в том, чтобы ставить `-e` перед каждой заменой, то есть` переименовывать -n -v -e "s / \. Php $ / \. Htm /" -e "y / az / AZ /" * `, но это дает ошибку. Документация (`man rename`) вводит в заблуждение, подразумевая, что вам нужно` -E`, чтобы использовать разделитель точек с запятой, но ответ Тото работает, как и `rename -n -v -E" s / \. Php $ / \. htm / "-E" y / az / AZ / "*` и `rename -n -v -e" s / \. php $ / \. htm /; " -e "y / az / AZ /" * `, а также причудливый` rename -n -v -e "s / \. php $ / \. htm /" -e ";" -e "y / az / AZ /" * `. Я пришел к выводу, что `-E` добавляет подразумеваемую точку с запятой между выражениями, тогда как` -e` требует явных точек с запятой. AFH 5 лет назад 1
@AFH, спасибо за полезные предложения! Dmitry Kabanov 5 лет назад 0

1 ответ на вопрос

2
Toto

Чтобы объединить несколько выражений, разделите выражения точкой с запятой (разделитель инструкций в Perl):

rename -n -v -e "s/\.php$/\.htm/; y/a-z/A-Z/" * 

Дополнительные варианты, основанные на комментариях @AFH

Другой способ (не нужно использовать -e, просто объедините все выражения с ;):

rename -n -v "s/\.php$/\.htm/; y/a-z/A-Z/" * 

Еще один способ (добавьте каждое выражение с помощью -e; обратите внимание ;на конец первого выражения):

rename -n -v -e "s/\.php$/\.htm/;" -e "y/a-z/A-Z/" * 

Еще один способ (добавьте каждое выражение с -Eдобавлением, которое ;неявно добавляет ):

rename -n -v -E "s/\.php$/\.htm/" -E "y/a-z/A-Z/" * 
Я расширил ваш ответ на основании комментария @AFH и принял его. Спасибо! Dmitry Kabanov 5 лет назад 0

Похожие вопросы