2012-06-15 10 views
16

Sólo me gustaría cambiar estaBash: Renombrar pequeña parte de varios archivos en el medio del nombre de

cc211_AMBER_13062012i.II cc211_GROMOS_13062012i.II 
cc211_CHARM_13062012i.II cc211_OPLS_13062012i.II 

a

cc211_AMBER_15062012i.II cc211_GROMOS_15062012i.II 
cc211_CHARM_15062012i.II cc211_OPLS_15062012i.II 

he intentado,

find -name "*.13 *" | xargs rename ".13" ".15" 

Hay normalmente no hay espacio entre el 3 y el segundo asterisco, eso solo lo pone en cursiva por lo que puedo ver. Básicamente hay muchas respuestas sobre qué hacer cuando está al final del nombre del archivo, donde Astérix parece funcionar, pero aquí no puedo hacerlo funcionar.

¡Cualquier cosa que tengas hará que mi vida sea mucho más fácil!

Edición 1: Ensayo

-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

-bash-4.1$ rename 's/_13/_15/' cc* 
-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

Gracias,

Charlie

+0

Por qué cambiar el nombre de ' "13" " 15" 'en lugar de' rename '_13' '_15' '? – chepner

Respuesta

22

¿Qué tal esto:

for i in *.II; do mv $i $(echo $i | sed 's/_13/_15/g'); done 

Esto reemplazará _13 con _15 en todos los archivos con extensión .II

Más información en sed here.

6
rename 's/_13/_15/' cc* 

En caso de hacer lo que quiera. La expresión regular s/_13/_15/ reemplaza _13 por _15 en todos los archivos que comienzan por 'cc'.

$ ls 
cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

$ rename 's/_13/_15/' cc* 

$ ls 
cc211_AMBER_15062012.II cc211_GROMOS_15062012.II 
cc211_CHARM_15062012.II cc211_OPLS_15062012.II 

Esto sólo funcionará con la versión más reciente de Perl rename. Para verificar qué versión tiene, haga man rename. Si la parte superior de la página dice

Guía de referencia de los programadores de Perl

tiene la versión de Perl. Si dice: Manual

usted tiene la versión estándar

Linux del programador (mayores).

Para la versión anterior, el comando debe ser:

rename _13 _15 cc* 
+0

Parece que no funcionó en mi caparazón, vea Editar 1? ¿Qué hice mal? – cc211

+1

Creo que tenemos diferentes versiones del comando 'rename'. He editado mi respuesta con más detalles, ¡espero que ayude! –

+3

'rename' es una herramienta de línea de comandos en el paquete perl, también conocido como' prename'. Puede usar expresiones perl infinitamente complejas, por lo que 'prename -n 'usa LWP :: Simple; my $ http = get (" http: //airport-authority.com/browse-FR");while($http=~m/>([>>]+) <\/a> \ ((\ w \ w \ w) \)/gc) {mis $ desde = $ 2; mi $ a = $ 1; $ a = ~ s// _/g; s/$ de/$ a/g}; ' MRS_DOLLY_PARTON.MP3 PUFF_DADDY.MP3' cambiará el nombre de los códigos de tres letras en nombres de archivo a nombres de puerto aéreo francés con guiones bajos, en este caso los dos MP3 se renombran 'Marseille_Airport_St_Gatien_AirportLY_PARTON.MP3' y' Uzein_AirportF_DADDY.MP3'. –

19

Una solución pura bash:

for i in cc*; do 
    mv "$i" "${i/_13/_15}" 
done 
+0

Eso es bastante limpio. –

+1

Sugeriría que se agreguen citas como esta para que no haya ningún problema con los espacios en los nombres de archivo: para i en cc *; hacer mv "$ i" "$ {i/_13/_15}"; hecho – syss

+0

@ user234461 No, las expansiones de parámetros usan patrones glob, no expresiones regulares. – chepner

0

estoy usando una solución pura de Linux:

### find all files that contains _DES in name and duplicate them adding _AUXLOCAL 
for f in **/*_DES*; do 
    cp "$f" "${f%.DES}_AUXLOCAL" 
done 
###Rename all _AUXLOCAL files, removing _DES to _LOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_DES/_LOCAL}" 
done 
###Rename all _AUXLOCAL files, removing _AUXLOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_AUXLOCAL/}" 
done 

espero que ayude

Cuestiones relacionadas