¿Cómo puedo reemplazar masivamente el prefijo para muchos archivos?
Tengo muchos archivos como
- TestSRConnectionContext.h
- TestSRConnectionContext.m
Me gustaría cambiarlos a
- CLConnectionContext.h
- CLConnectionContext.m
¿Cómo haría esto?
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
Utiliza la sustitución del comando bash para eliminar los primeros 6 caracteres del nombre de archivo de entrada a través de cut
, antecede CL
al resultado y lo almacena $newname
. Luego cambia el nombre antiguo al nuevo nombre. Esto se realiza en cada archivo.
cut -c7-
especifica que solo los caracteres después del índice 7 deben ser devueltos desde la entrada. 7-
es un rango que comienza en el índice 7 sin fin; es decir, hasta el final de la línea.
Anteriormente, lo había usado cut -b7-
, pero -c
debería usarse en su lugar para manejar codificaciones de caracteres que podrían tener múltiples bytes por carácter, como UTF-8.
Yo diría que lo más simple es usar el
rename
comando que es común en muchas distribuciones de Linux. Hay dos versiones comunes de este comando, así que revise su página de manual para encontrar cuál tiene:Si desea utilizar la versión de util-linux-ng en un sistema Debian, está disponible con el nombre
rename.ul
fuente
rename
existen múltiples versiones de en la naturaleza. Consulte surename
documentación local para descubrir cómo usar la suya.rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
La expansión de parámetros de Shell es suficiente para transformaciones simples como esta. La sustitución de comandos es menos eficiente debido a la necesidad de generar procesos adicionales (para la sustitución de comandos en sí y el
cut
/sed
).fuente
TestSR*
encuentra los archivos,CL${f#TestSR}
será el nuevo nombre. Las cosas después de la#
serán sustituidas por el nombre del archivo (f
).Aquí hay una manera:
ls *.{h,m}
-> Buscar todos los archivos con extensión .h o .mn=CL
-> Agregar un prefijo CL al nombre del archivosed -e 's/^Test//'
-> Elimina el prefijo de prueba del nombre del archivomv $a $n
-> Realiza el cambio de nombrefuente
Puedes probar con:
Consulte
man bash
(sección "Expansión de parámetros") para más detalles.fuente
Bueno, no fue tan difícil como yo.
fuente
for f in TestSR*.[mh]
,for f in TestSR*.{m,h}
,for f in TestSR*.m TestSR*.h
.Si necesitas algo más placentero puedes hacerlo
fuente