búsqueda recursiva y borrar archivos según extensión

Imagen de patagonian18
0 puntos

Introducción:

Hace muuucho tiempo, bajé la colección de ilustraciones openclipart. En el apartado de Download, habían dos opciones, bajar sólo las imágenes png o las png y svg. En ese momento, me decidí por la segunda opción pensando en que podía ocupar las imágenes en formato svg para construir alguna página web. Sin embargo, pasado el tiempo, las dichosas imágenes están acumulando polvo y sólo utilizo las png que añadí a la galería de OOo. Así que decidí borrar las imágenes *.svg y los archivos *.txt que las acompañaban.

Problema:

Me dispuse a borrar los archivos por teminal con el consabido rm -r *.svg *.txt, pero la cosa no era tan simple. Sucede que viene un directorio Clipart y dentro de este varias imágenes tanto png como svg, además de un buen número de subdirectorios, que a su vez tienen otros subdirectorioas anidados e imágenes en su interior. Después de haber entrado y salido del tercer subdirectorio anidado en lo más recóndito borrando las imágenes *.svg, me quedó claro que tenía que haber una forma más elegante de realizar dicha tarea. Así que me dispuse a escribir un script en bash, pero me encontré con los inconvenientes que paso a enumerar:

- No tengo ni peregrina idea de programar en bash; sin embargo, sé programar en C (nivel "Hola mundo reloaded") y en Matlab.

- No encuentro como averiguar si un directorio tiene o no tiene subdirectorios en su interior. He buscado en google, pero la totalidad de los "tutoriales bash" que he encontrado (en castellano) no pasa mucho más allá de cd y mkdir.

 Mi idea acerca de como debe trabajar el script es la siguiente:

#parto de la base que estoy en el directorio Clipart.

hacer:

     rm -r *.svg *.txt

     ¿existe subdirectorio?

         Sí: ingreso a subdirectorio 

           rm -r *.svg *.txt

           ¿existe subdirectorio?

              No: retrocede a directorio superior.

Una vez que haya vuelto al directorio principal, Clipart, navega en el segundo subdirectorio y sus sub-subdirectorios anidados, borra lo que haya que borrar, vuelve a Clipart... hasta que haya recorrido todos los subdirectorios.

Si alguien puede tirarme un cable tendrá mi eterno agradecimiento :)

-------------------------------------------------------

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

 

Imagen de cousteau
+1
0
-1

He probado esto pero no funciona:

Programa: /usr/local/bin/eliminar (con permisos de ejecución)

#!/bin/sh
rm $*
lista=`ls -d */`
for i in $lista
do
cd $i
eliminar $*
cd ..
done

Para probarlo, mejor sustituye "rm" de la segunda línea por "ls", así sólo te muestra los archivos en vez de borrarlos.

Uso:

eliminar *.txt

Espero que te sirva al menos de inspiración.


«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de patagonian18
+1
0
-1

Gracias. Eso es lo que necesito, inspiración jeje. La versión final del script la puedo trabajar yo. Más que nada necesito ideas, de como se puede hacer. 

-------------------------------------------------------

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

+1
0
-1

 

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

Imagen de banyut
+1
0
-1

veo que ya lo tienes solucionado pero igual te sirve para otra vez.

Echale una ojeada a la instrucción find, con ella podras borrar todos los archivos que quieras.

saludos 

- - - 

La Inteligencia me persigue, pero ..... YO SOY MÁS RÁPIDO!!!!!

 Blog: banyut.obolog.com
Usuario Linux #453776              Ubuntu User # 17343

 

+1
0
-1

La Inteligencia me persigue, pero ..... YO SOY MÁS RÁPIDO!!!!!

Usuario Linux #453776              Ubuntu User # 17343

 

Imagen de patagonian18
+1
0
-1

La verdad es que aun no lo soluciono, pero creo que lo del find es buena idea. Cuando tenga el script en condiciones lo publico aquí.

-------------------------------------------------------

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

+1
0
-1

 

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

Imagen de sansatan
+1
0
-1

Con find no necesitas escribir un script, es una sencilla línea de comandos. Lee la opción -exec:

man find 

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

+1
0
-1

--------------------------------------

Un error muy frecuente: Confundir valor y precio.

Imagen de banyut
+1
0
-1

creo recordar que en un tutorial sobre find que publique en mi blog( y creo que tambien lo puese aqui, en la seccion how to), estaba la instruccion para  hacerlo, de todas formas con un simple vistazo al man lo podras solucionar. 

- - -  

La Inteligencia me persigue, pero ..... YO SOY MÁS RÁPIDO!!!!!

blog: banyut.obolog.com
Usuario Linux #453776 Ubuntu User # 17343

 

+1
0
-1

La Inteligencia me persigue, pero ..... YO SOY MÁS RÁPIDO!!!!!

Usuario Linux #453776              Ubuntu User # 17343

 

Imagen de patagonian18
+1
0
-1

Gracias a todos los que aportaron. Al final lo resolví con:

$  find ./clipart -name *.svg -type f -print | xargs /bin/rm -f

La línea salía tal cual en el manual de find. Todavía me queda la duda acerca de si se puede saber si un directorio tiene subdirectorios o no, de forma de poder usar la condición dentro de un if, por ejemplo. En todo caso, será cosa de seguir leyendo :p 

-------------------------------------------------------

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

+1
0
-1

 

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

Imagen de brunov
+1
0
-1

Bueno, aunque ya esté solucionado supongo que no estará de más dar mi propuesta.
El comando find tiene la opción de ejectuar cualquier comando sobre los archivos o directorios que encuentra. En tu caso, serviría:

find -name "*.svg" -exec rm {} \;

Como ya lo notaron antes en este thread, podés reemplazar "rm" por "ls" para ver bien qué archivos borraría.
El comando lo deberías ejecutar en el directorio de interés; find por naturaleza se mueve recursivamente, así que descenderá a todos los directorios desde el original, borrando los archivos de la extensión en cuestión.

Espero sirva, saludos!

+1
0
-1
Imagen de patagonian18
+1
0
-1

Todo aporte es bienvenido. Siempre es bueno conocer más de una manera de hacer las cosas.

-------------------------------------------------------

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

+1
0
-1

 

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

Imagen de gregpollone
+1
0
-1

Aqui aprendi a utilizar el comando find que enlista los resultados
Por ejemplo:

find -name "*.dat" -exec ls {} \;

me gustaria saber si puedo guardar las rutas de cada archivo en variables para despues acceder en lenguaje c

saludos.

+1
0
-1
Imagen de payperme
+1
0
-1

Gracias por el aporte se agradece, no encontraba como hacerlo

+1
0
-1

IroN_MaN

Imagen de jalemolina
+1
0
-1

Si no tienes activado el conjunto extendido de comodines puedes activarlo con:

shopt -s extglob

Una vez activo puedes usar esto:

rm -R *.@(svg|txt)

y si quisieras borrar todos los archivos menos los png:

rm -R !(*.png)

+1
0
-1