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 _door
usando cambiar nombre:
rename -v 's/_door//' *
Esto lo busca _door
y lo reemplaza con nada, esencialmente eliminándolo.
Respuesta2
- Está escapando del guión bajo en el lado de búsqueda de la expresión y no debería ser así.
- 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 -n
bandera 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