Batch Renomear Usando Regex, mas Mainaining Alguns Substring

0

Eu fiz muita pesquisa antes de colocar essa questão. Eu encontrei um links diferentes para renomear lote usando regex como este e outros similares:

* Arquivo baseado em padrões, arquivo de lote renomeia no terminal

Meu problema é isso, eu quero renomear em lote usando o Regex, mas meu código não funciona.

Eu tenho dentro de uma pasta arquivos diferentes assim:

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

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 aproxima a maior parte do que eu queria era:

$  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

    
por technology_dreamer 05.08.2014 / 01:04

4 respostas

1

Você precisa usar referências anteriores . Classes de caracteres não significam nada na expressão de substituição. De fato, poucos caracteres têm significados especiais na expressão de substituição. Eu suponho 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 sinalizador -n para ver quais renomeações ocorrerão antes de realmente executá-las.

    
por muru 05.08.2014 / 01:35
2
  1. Você está escapando do sublinhado no lado da pesquisa da expressão e não deve ser.
  2. Você precisa de uma sub pesquisa (os números) e de um espaço reservado para armazenar e usar o resultado da sub pesquisa.

Adicionar parênteses ao redor do [0-9] criará a sub-pesquisa necessária. Como é a primeira subpesquisa, ela pode ser chamada de $ 1 no lado da substituição. O resultado segue ..

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

Espero que isso ajude.

    
por user311381 05.08.2014 / 01:36
2

Uma maneira muito mais fácil seria simplesmente excluir _door usando renomear:

rename -v 's/_door//' *

Isso procura _door e o substitui por nada, essencialmente excluindo-o.

    
por Alaa Ali 05.08.2014 / 01:48
0

Isso funciona na Fish Shell

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end
    
por jeffmcneill 05.08.2016 / 07:32