¿Cómo cambio el nombre de varios archivos eliminando caracteres en bash?

10

Tengo que cambiar el nombre de varios archivos en el directorio eliminando los primeros 5 caracteres para cada nombre de archivo.
¿Cómo puedo hacer esto bash / shell? Estoy usando Ubuntu 11.10. Gracias.

wlk
fuente

Respuestas:

11

Un bucle simple con un poco de sedhará el truco:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

El regex sustituto en seddice que coincida con cinco caracteres ( .significa cualquier carácter) al comienzo de la cadena ( ^) y elimínelo.

James O'Gorman
fuente
9

Bash tiene algunas posibilidades increíbles de secuencias de comandos. Aquí hay una manera:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

Una forma práctica de probar lo que haría es agregar un eco delante del comando:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

Los seis signos de interrogación aseguran que solo intente hacer esto con nombres de archivo de más de 5 caracteres.

Ladadadada
fuente
5

Puedes usar sed para hacer esto

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done
usuario9517
fuente
5

Todas excelentes respuestas, gracias. Esto es lo que funcionó en mi caso:

rename 's/^.......//g' *
wlk
fuente
1

Mis dos centavos':

for file in *; do mv $file ${file:5}; done

${file:n}elimina los primeros ncaracteres de la cadena file.

dkcm
fuente
La respuesta más elegante.
Sandwich hace