Я провел много исследований, прежде чем задать этот вопрос. Я нашел разные ссылки для пакетного переименования с использованием регулярных выражений, например, такие и подобные:
*Пакетное переименование файлов на основе шаблона в терминале
Моя проблема в следующем: я хочу выполнить пакетное переименование с помощью 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
- Вы экранируете подчеркивание в поисковой части выражения, хотя так делать не следует.
- Вам понадобится подпоиск (номера) и заполнитель для хранения и использования результата подпоиска.
Добавление скобок вокруг [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