Resulta que esto ya van varias veces que lo he llegado a necesitar y hoy también 😛 y pues nada, que después de batallar un poco volví a encontrar el comando correcto para poder eliminar de forma recursiva archivos en Gnu/Linux 🙂
Básicamente es usar el comando find 🙂
Si quisieramos encontrar todos los archivos .odt de forma recursiva dentro de un directorio la orden sería la siguiente:
hbautista@soporte:~$ find documentos/2009/ -type f -name «*.odt»
documentos/2009/Servicios/Solicitud_de_Servicio.odt
documentos/2009/Justificantes/Faltas_19Feb09.odt
documentos/2009/Informe_Comision_Selva.odt
hbautista@soporte:~$
Como ven dentro de ese directorio no hay muchos archivos, pero imaginen que por alguna extraña razón se encuentran con un disco duro externo en donde se crean un monton de archivos Thumbs.db
hbautista@soporte:~$ find /media/Mastodonte/ -type f -name «*.db»
/media/Mastodonte/dad/Users/CHILO/AppData/Local/IconCache.db
/media/Mastodonte/dad/Users/CHILO/AppData/Local/Microsoft/Windows/Explorer/thumbcache_1024.db
/media/Mastodonte/dad/Users/CHILO/AppData/Local/Microsoft/Windows/Explorer/thumbcache_256.db
.
.
.
/media/Mastodonte/info/Imagenes/Thumbs.db
/media/Mastodonte/info/Imagenes/Wallpaper/Thumbs.db
/media/Mastodonte/info/Imagenes/Wolverine/Thumbs.db
/media/Mastodonte/info/Imagenes/x-men/Thumbs.db
hbautista@soporte:~$
Y pues la verdad en mi caso me desespera que se creen tantos archivos ocupando espacio que puede ser valioso 😉
La forma correcta de eliminar de forma segura y recursiva TODOS esos archivos sería añadir un parámetro más a la orden anterior, quedando de la siguiente manera:
hbautista@soporte:~$ find /media/Mastodonte/ -type f -name «Thumbs.db» -exec rm {} \;
Aunque igual y se puede resumir a lo siguiente:
hbautista@soporte:~$ find /media/Mastodonte/ -name «Thumbs.db» -exec rm {} \;
Y con eso logramos nuestro objetivo 🙂
molto interesante
Eso lo aprendi en la academia de redhat en la univ. politecnica =0. jjajaj 🙂
El find de GNU (que es el que tiene cualquier Linux) tiene el operador
-delete
. Usar ese en lugar del-exec rm {} \;
no solo es más sencillo de leer 😉 es más rápido, por que evita el par de llamadas fork/exec para cada archivo.find, por supuesto, no sirve sólo para borrar cosas. Ejemplo sencillo: ¿En cual de mis archivos java se usa la función blaBlaBla? Ah, pues en
find src -name '*.java' -exec grep 'blaBlaBla' {} \;
🙂Esto va a ser muy lento, por la misma razón mencionada arriba: Está haciendo un fork/exec para cada archivo. La solución es el comando
xargs
. Usando esto nuestro ejemplo se convierte enfind src -name '*.java' | xargs grep 'blaBlaBla'
. No siempre podemos usarxargs
, porque necesitamos que el comando a ejecutar sea de la formacomando argumentos archivo archivo ...
, pero cuando sirve, ayuda mucho al desempeño.(Uff, yo sólo venía a hacer un comentario de rapidito 😀 )