1 votos

Terminal: Quitar la extensión específica de forma recursiva

Tengo una carpeta, que contiene muchas otras carpetas.

Algunas de las carpetas contenidas en el mismo (en el arbitrarias en las profundidades) tiene una extensión específica, digamos, .ext:

TopFolder
+ Folder1
| + Folder11.ext
|   +Folder111
+ Folder2.ext

Quiero utilizar el Terminal para quitar la extensión de todas las carpetas en cualquier subcarpeta de modo que se parece a esto:

TopFolder
+ Folder1
| + Folder11
|   +Folder111
+ Folder2

He jugado un poco con encontrar y xargs, pero no pude hacerlo funcionar.

1voto

blm Puntos 283

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.

0voto

Michael Zhou Puntos 167

Puede utilizar una búsqueda en línea de comandos y los parámetros de expansión.

find . -type d -name '*.ext' -exec ksh -c 'for dir
    do mv "$dir" "${dir%.*}"
    done' _ {} +

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X