¿Cómo cambiar el nombre de muchos archivos en bash shell?

¿Cómo cambiar el nombre de muchos archivos en bash shell?

Perdón por la pregunta. Busqué mucho en Internet, pero no pude encontrar una respuesta que funcionara (aunque hubo muchas sugerencias).

Entonces, quiero cambiar el nombre de MUCHOS archivos. Escribir todos los nombres de archivos no es una opción. Los archivos se nombran así:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

el principio es siempre el mismo y además el .IMA. El número largo no es el mismo para todos los archivos. Tengo que cambiar el 039 por 036_2, para todos los archivos. El resto debería seguir igual.

Probé todos los siguientes comandos (más varios otros), pero no hizo nada:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl está instalado en el sistema Linux (pero no estoy seguro de cómo llamarlo... porque si abro una terminal Perl no hace nada).

¿Me puedes ayudar?

Respuesta1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

Explicación:

for file in * ; do _______ ; done

bash realizará la expansión del shell *para enumerar todos los archivos en el directorio de trabajo. Para cada uno de estos archivos, esta estructura de comando establecerá la variable filepara que sea igual al nombre del archivo y ejecutará el comando entre ; doy; done

mv $file _______

mves la forma tradicional de cambiar el nombre de archivos en Unix/Linux. Cambiará el nombre filea_______

echo $file | sed 's/_039/_036_2'

echo $file | sedsimplemente enviará " file" a la entrada estándar de sed, donde sedsustituirá "_039" por "_036_2"

En total: para cada archivo en el directorio actual, cambie el nombre del archivo, sustituyendo "_039" por "_036_2"

Respuesta2

Tu expresión regular está mal, aquí hay una que debería funcionar.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

Está utilizando la herramienta correcta, no es necesario buscar a menos que tenga subdirectorios.


Nota sobre expresiones regulares en sed y cambio de nombre.

El formato es sXsearch_patternXreplace_patternXoptions( Xpuede ser cualquier carácter). searchPattern es lo que busca reemplazar, lo que ya existe, no lo que está reemplazando.

-wes una sola palabra y solo puede estar en search_pattern.

Respuesta3

encontrar . -nombre "*039*" | cambiar el nombre de 's/039/036_2/g'

Respuesta4

Repita todos los archivos con el prefijo "HAUPT_...", luego cambie el nombre usando la subcadena del shell ${f:15}y devuelve la cadena del carácter 15 del nombre del archivo, adjunta al HAUPT_...prefijo.

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

EDITAR - Parece que el directorio con todos los archivos también contiene subdirectorios con el mismo prefijo HAUPT.... En ese caso, utilice el findcomando para filtrar primero solo los archivos y no los directorios.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

información relacionada