Quiero iterar recursivamente a través de un directorio y cambiar la extensión de todos los archivos de una extensión determinada, digamos .t1
a .t2
. ¿Cuál es el comando de bash para hacer esto?
Respuestas
115 para la respuesta № 1Si tiene renombrado disponible entonces use:
find . -name "*.t1" -exec rename "s/.t1$/.t2/" "{}" ;
Si el cambio de nombre no está disponible, use:
find . -name "*.t1" -exec bash -c "mv "$1" "${1%.t1}".t2" - "{}" ;
7 para la respuesta № 2
Si tu versión de bash
apoya el globstar
Opción (versión 4 o posterior):
shopt -s globstar
for f in **/*.t1; do
mv "$f" "${f%.t1}.t2"
done
5 para la respuesta № 3
O simplemente puede instalar el mmv
ordena y haz:
mmv "*.t1" "#1.t2"
aquí #1
es la primera parte global, es decir, la *
en *.t1
.
O en cosas de puro bash, una forma simple sería:
for f in *.t1; do
mv "$f" "${i%.t1}.t2"
done
(es decir.: for
puede listar archivos sin la ayuda de un comando externo como ls
o find
)
HTH
2 para la respuesta № 4
Haría de esta manera en bash:
for i in $(ls *.t1);
do
mv "$i" "${i%.t1}.t2"
done
EDITAR: mi error: no es recursivo, aquí está mi manera de cambiar el nombre de archivo recursivo:
for i in $(find `pwd` -name "*.t1");
do
mv "$i" "${i%.t1}.t2"
done