Pesquisei bastante antes de fazer essa pergunta. Encontrei links diferentes para renomear em lote usando regex como este e outros semelhantes:
*Baseado em padrão, renomeação de arquivo em lote no terminal
Meu problema é o seguinte: quero renomear em lote usando Regex, mas meu código não funciona.
Eu tenho dentro de uma pasta arquivos diferentes com nomes assim:
name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg
E eu quero renomear os arquivos assim:
name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg
O código que mais se aproxima do que eu quero foi:
$ rename -v 's/house\_[0-9]\_door/house_[0-9]/'
Mas como você deve saber, o primeiro arquivo foi renomeado como: name_house_[0-9].jpg
Responder1
Uma maneira muito mais fácil seria simplesmente excluir _door
usando renomear:
rename -v 's/_door//' *
Isso procura _door
e substitui por nada, essencialmente excluindo-o.
Responder2
- Você está escapando do sublinhado no lado de pesquisa da expressão e não deveria.
- Você precisa de uma subpesquisa (os números) e de um espaço reservado para armazenar e usar o resultado da subpesquisa.
Adicionar parênteses em torno de [0-9] criará a subpesquisa necessária. Como é a primeira subpesquisa, pode ser chamada de $1 no lado da substituição. O resultado segue..
rename -v 's/house_([0-9])\_door/house_$1/' *
Espero que isto ajude.
Responder3
Você precisa usarreferências anteriores. As classes de caracteres não significam nada na expressão de substituição. Na verdade, poucos caracteres têm significados especiais na expressão de substituição. Suponho que algo como:
rename -v 's/house_([0-9])_door/house_$1/'
(ou)
rename -v 's/(house_[0-9])_door/$1/'
Além disso, use o -n
sinalizador para ver quais renomeações acontecerão antes de realizá-las.
Responder4
Isso funciona em Fish Shell
for file in *.jpg;
mv -n $file (basename $file _door.jpg).jpg;
end