Prueba esto:
$ find TopFolder -print
Topfolder
Topfolder/Folder1
Topfolder/Folder1/Folder11.ext
Topfolder/Folder1/Folder11.ext/Folder111
Topfolder/Folder2.ext
$ find TopFolder -name '*.ext' -print | while read i; do mv -v "$i" "${i%.ext}";done
$ find TopFolder
TopFolder
TopFolder/Folder1
TopFolder/Folder1/Folder11
TopFolder/Folder1/Folder11/Folder111
TopFolder/Folder2
El primer y último hallazgo son solo para mostrar la jerarquía antes y después. Así es como funciona la búsqueda central, la que hace el trabajo real:
$ find TopFolder -name '*.ext' -print
Esto encuentra que todo en TopFolder coincide con el patrón '*.ext'
, es decir, todos los archivos y directorios que terminan en .ext, e imprime la ruta a cada uno. Si desea limitarlo a solo directorios, agregue -type d
.
while read i; do
read i
lee desde la entrada estándar en la variable de shell i
. while
realiza un bucle hasta que read i
devuelve false, lo que hace en el final del archivo. Dado que la salida de find
se está canalizando a la vez, la entrada estándar de read
es la salida de find
, por lo que read
leerá una línea a la vez desde la salida de find
hasta que no haya ninguna. izquierda.
mv -v "$i" "${i%.ext}"
Esto hace el cambio de nombre real. El -v
está allí solo para que pueda ver lo que está sucediendo, puede omitirlo si lo desea. "$i"
es la fuente, citado en caso de que algún elemento de la ruta en $i
contenga espacios. "${i%.ext}"
es el destino, que es $i
, con cualquier .ext
final eliminado.
done
Esto solo termina el ciclo while.
Tenga en cuenta que esto está en bash, debería ser factible en otros shells bastante modernos, pero la sintaxis puede ser un poco diferente.