Я изучаю, как использовать утилиту командной строки для rename Unix (см., Например, 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)

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

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

1 ответ1

2

Чтобы объединить несколько выражений, разделите выражения точкой с запятой (разделитель инструкций в 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/" *

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .