![¿Cómo cambiar el nombre de muchos archivos en bash shell?](https://rvso.com/image/1416382/%C2%BFC%C3%B3mo%20cambiar%20el%20nombre%20de%20muchos%20archivos%20en%20bash%20shell%3F.png)
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 file
para que sea igual al nombre del archivo y ejecutará el comando entre ; do
y; done
mv $file _______
mv
es la forma tradicional de cambiar el nombre de archivos en Unix/Linux. Cambiará el nombre file
a_______
echo $file | sed 's/_039/_036_2'
echo $file | sed
simplemente enviará " file
" a la entrada estándar de sed
, donde sed
sustituirá "_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
( X
puede ser cualquier carácter). searchPattern es lo que busca reemplazar, lo que ya existe, no lo que está reemplazando.
-w
es 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 find
comando 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