2012-03-26 14 views
11

Estaba buscando una línea de comandos de Linux de una sola línea para cambiar el nombre de un grupo de archivos en una sola toma.Un trazador de líneas para renombrar el grupo de archivos

pattern1.a pattern1.b pattern1.c ... 

Una vez que se ejecuta el comando que debería obtener

pattern2.a pattern2.b pattern2.c ... 
+0

posible duplicado de [Cambiar el nombre de varios archivos en Unix] (http://stackoverflow.com/questions/1086502/rename-multiple-files-in-unix) –

Respuesta

12
for i in pattern1.*; do mv -- "$i" "${i/pattern1/pattern2}"; done 

antes de ejecutarlo, se adhieren una echo frente al mv para ver lo que sería hacer.

1

Muchas maneras de despellejar a este gato. Si prefiere su patrón a ser una expresión regular en lugar de un fileglob, y que le gustaría hacer el cambio de forma recursiva usted podría utilizar algo como esto:

find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p' 

Como kerrek sugirió con su respuesta, este primero te muestra lo que haría. Pipe la salida a través de un shell (es decir, agregue | sh hasta el final) una vez que se sienta cómodo con los comandos.

Esto funciona para mí:

[[email protected] ~]$ ls -l foo.* 
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.php 
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.txt 
[[email protected] ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' 
mv "./foo.txt" "bar.txt" 
mv "./foo.php" "bar.php" 
[[email protected] ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh 
[[email protected] ~]$ ls -l foo.* bar.* 
ls: foo.*: No such file or directory 
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.php 
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.txt 
[[email protected] ~]$ 
+0

¿Necesitamos la metáfora de "piel de gato" allí? : D –

11

Si se esté utilizando Linux, también puede tener un script de Perl en/usr/bin/cambiar el nombre de la cual la caña de renombrar archivos basándose en patrones más complejos que el englobamiento cáscara permisos.

El/usr/bin/rename en uno de mis sistemas está documentado here. Podría ser utilizado como esto:

rename "s/pattern1/pattern2/" pattern1.* 

Un número de other Linux environments parecen tener un diferente rename que podría ser utilizado como esto:

rename pattern1 pattern2 pattern1.* 

Comprobar man rename en su sistema para obtener más información.

+1

Thumbs up para el segundo ejemplo de cambio de nombre; busqué en toda la web y no pude encontrar el problema por el cual '' s/pattern1/pattern2/"' no funcionó! –

Cuestiones relacionadas