Intente 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
La primera y la última son sólo para mostrar el antes y el después de la jerarquía. He aquí cómo el medio de encontrar, el que hace el trabajo real, funciona:
$ find TopFolder -name '*.ext' -print
Este se encuentra todo en TopFolder coincide con el patrón '*.ext'
, que es de todos los directorios y archivos que terminan en .ext, y se imprime la ruta de acceso a cada uno de ellos. Si desea limitar solo a los directorios, agregar -type d
.
while read i; do
read i
lee de la entrada estándar en la variable de shell i
. while
bucles hasta read i
devuelve false, lo que se hace en fin de archivo. Ser find
's de la salida es que se canaliza a la vez, read
's de la entrada estándar es el resultado de la find
, lo read
va a leer una línea en un momento de la find
de salida hasta que no quede ninguno.
mv -v "$i" "${i%.ext}"
Esto hace el real de cambiar el nombre. El -v
está allí sólo para que usted pueda ver lo que está sucediendo, puede dejar, si quieres. "$i"
es la fuente, citada en el caso de que cualquier elemento de la ruta de acceso en $i
contiene espacios. "${i%.ext}"
es el destino, que es $i
, con cualquier trailing .ext
eliminado.
done
Esto sólo termina el bucle while.
Tenga en cuenta que esto es en bash, debe ser factible en otros bastante moderno conchas, pero la sintaxis puede ser un poco diferente.