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

1

Tengo una carpeta que contiene muchas otras carpetas.

Algunas de las carpetas que contiene (a profundidades arbitrarias) tienen una extensión específica, digamos, .ext :

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

Quiero usar Terminal para eliminar esa extensión de todas las carpetas en cualquier subcarpeta para que se vea así:

TopFolder
+ Folder1
| + Folder11
|   +Folder111
+ Folder2

He jugado con buscar y xargs, pero no pude hacerlo funcionar.

    
pregunta fzwo 21.10.2015 - 19:29

2 respuestas

1

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.

    
respondido por el blm 21.10.2015 - 19:48
0

Puede usar un script de búsqueda en línea y la expansión de parámetros.

find . -type d -name '*.ext' -exec ksh -c 'for dir
    do mv "$dir" "${dir%.*}"
    done' _ {} +
    
respondido por el fd0 21.10.2015 - 19:50

Lea otras preguntas en las etiquetas