Cambiar el nombre por lotes usando expresiones regulares pero manteniendo alguna subcadena

Cambiar el nombre por lotes usando expresiones regulares pero manteniendo alguna subcadena

Investigué mucho antes de hacer esta pregunta. Encontré enlaces diferentes para cambiar el nombre por lotes usando expresiones regulares como esta y otras similares:

*Cambio de nombre de archivo por lotes basado en patrones en la terminal

Mi problema es este: quiero cambiar el nombre por lotes usando Regex pero mi código no funciona.

Tengo dentro de una carpeta diferentes archivos llamados así:

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

Y quiero cambiar el nombre de los archivos así:

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

El código que se aproxima a la mayor parte de lo que quiero fue:

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

Pero como ya debes saber, el primer archivo pasó a llamarse: name_house_[0-9].jpg

Respuesta1

Una forma mucho más sencilla sería simplemente eliminar _doorusando cambiar nombre:

rename -v 's/_door//' *

Esto lo busca _doory lo reemplaza con nada, esencialmente eliminándolo.

Respuesta2

  1. Está escapando del guión bajo en el lado de búsqueda de la expresión y no debería ser así.
  2. Necesita una subbúsqueda (los números) y un marcador de posición para almacenar y utilizar el resultado de la subbúsqueda.

Agregar paréntesis alrededor de [0-9] creará la subbúsqueda necesaria. Dado que es la primera subbúsqueda, se la puede denominar $1 en el lado de reemplazo. El resultado sigue...

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

Espero que esto ayude.

Respuesta3

Necesitas usarreferencias anteriores. Las clases de caracteres no significan nada en la expresión de reemplazo. De hecho, pocos caracteres tienen significados especiales en la expresión de reemplazo. Supongo que algo como:

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

(o)

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

Además, utilice la -nbandera para ver qué cambios de nombre se realizarán antes de realizarlos.

Respuesta4

Esto funciona en Fish Shell

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

información relacionada