Bash cambio de nombre múltiple en una línea: ¿es posible?

Bash cambio de nombre múltiple en una línea: ¿es posible?

¿Es posible cambiar el nombre y sustituir on fly con bash? por ejemplo yo tengo

  VTS_01_1.VOB  VTS_01_2.VOB  VTS_01_3.VOB

Quiero cambiar el nombre para usarlo en mencoder con

movie_1.avi movie_2.avi,etc..

Sé cómo sustituir VTS, pero no VOB.

for i in  VTS_01_[1-4]*B;do echo ${i/VTS_0?_?.VOB/Movie}.avi;done

dame

Movie.avi
Movie.avi
Movie.avi
Movie.avi

deseo

Movie_1.avi
Movie_2.avi
Movie_3.avi
Movie_4.avi

Respuesta1

Puedes hacerlo en dos pasos, por ejemplo, primero elimina la extensión y luego sustituye el VTS_01prefijo:

$ for i in VTS_01_[1-4]*B; do b="${i%.VOB}"; echo "${b/VTS_01/Movie}.avi"; done
Movie_1.avi
Movie_2.avi
Movie_3.avi

Respuesta2

Usarrebautizarprograma. Utiliza expresión Perl. Sin embargo, aquí no tenemos una expresión compleja.

En este caso puedes usar esto:

rename VTS_01 movie VTS_01*VOB

Respuesta3

¿Por qué no usas Python? Algo como

$ ipython
In [1]: import os
In [2]: all_files = os.listdir(".")
In [3]: for filename in all_files:
In [4]:     newname = 'Movie' + filename[6:9] + 'avi'
In [5]:     os.rename(filename, newname)

debería resolver tu problema.

Respuesta4

¡Bingo!

for i in  VTS_01_[1-4]*B;do echo mv $i  "$(echo $i|sed 's/VTS/Movie/g;s/VOB/avi/g')";done

Es más útil con comandos como mencoder, etc.

información relacionada