Пакетное переименование с использованием регулярных выражений, но с сохранением некоторой подстроки

Пакетное переименование с использованием регулярных выражений, но с сохранением некоторой подстроки

Я провел много исследований, прежде чем задать этот вопрос. Я нашел разные ссылки для пакетного переименования с использованием регулярных выражений, например, такие и подобные:

*Пакетное переименование файлов на основе шаблона в терминале

Моя проблема в следующем: я хочу выполнить пакетное переименование с помощью Regex, но мой код не работает.

У меня внутри папки есть разные файлы, названные примерно так:

name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg

И я хочу переименовать файлы вот так:

name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg

Код, который примерно соответствовал тому, что мне нужно, был следующим:

$  rename -v 's/house\_[0-9]\_door/house_[0-9]/'

Но, как вы знаете, первый файл был переименован в: name_house_[0-9].jpg.

решение1

Гораздо проще было бы просто удалить, _doorиспользуя переименование:

rename -v 's/_door//' *

Это позволит найти _doorи заменить его ничем, по сути, удалив его.

решение2

  1. Вы экранируете подчеркивание в поисковой части выражения, хотя так делать не следует.
  2. Вам понадобится подпоиск (номера) и заполнитель для хранения и использования результата подпоиска.

Добавление скобок вокруг [0-9] создаст необходимый подпоиск. Поскольку это первый подпоиск, его можно обозначить как $1 на стороне замены. Результат следующий..

rename -v 's/house_([0-9])\_door/house_$1/' *

Надеюсь это поможет.

решение3

Вам нужно использоватьобратные ссылки. Классы символов ничего не значат в выражении замены. Фактически, лишь немногие символы имеют особое значение в выражении замены. Я предполагаю что-то вроде:

rename -v 's/house_([0-9])_door/house_$1/'

(или)

rename -v 's/(house_[0-9])_door/$1/'

Кроме того, используйте -nфлаг, чтобы увидеть, какие переименования произойдут, прежде чем выполнять их.

решение4

Это работает в Fish Shell

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end

Связанный контент