Optimizando nuestras búsquedas: updatedb y locate

Este post trata sobre cómo optimizar nuestras búsquedas de una manera bastante eficiente y estandarizada (porque deben existir estos comandos en todas las distribuciones GNU/Linux).

Comienzo diciéndoles que ésta semana hice unas cuantas súper búsquedas súper filtradas usando find y llenas de grep en un disco duro de 500 Gb repleto hasta el tope y hasta con un repo de Ubuntu (sabemos lo que esto significa). Como podrán entender la primera búsqueda se demoró un poco (aunque no mucho) por el find (no por los grep), pero a partir de la segunda búsqueda ya las hacía mucho más rápido, como si tuviera las cosas guardadas en una caché (aunque estoy seguro que eso es lo que hace). Cuando le comento eso a mi hermano, me pregunta: ¿Qué utilizaste?¿updatedb y locate? Pregunta que cautivó mi interés.

Antes de conocer éstos comandos, yo hacía lo siguiente:

– Hacía un primer find y guardaba en un fichero los resultados:

$ find [dirección] > fichero1

 – Luego, le hacía los grep (entre otras cosillas) al fichero (grep es increiblemete rápido), por ejemplo:

$ grep teléfonos.txt$ fichero1 |xargs cat|grep -iA1 carlos

Saliéndome como resultado todos los Carlos con sus respectivos teléfonos que tengo en un fichero teléfonos.txt que está ubicado en algún lugar del disco duro.

A como yo lo veo…, no es un trabajo muy limpio que digamos. Además de que es bastante difícil hacer que filtre el patrón deseado sólo en el nombre del archivo, sin incluir sus directorios padres. Pues… ahí les va quienes nos van a resolver todos nuestros problemas, los que dan título a éste artículo.

Primero debemos crear la base de datos de los ficheros que tenemos en una X dirección, para esto está updatedb. Si no le ponemos argumentos, crea una base de datos de todo el sistema de ficheros. Si queremos especificarle un camino, usamos la siguiente signatura (notar que por defecto hay que ejecutarlo como root):

# updatedb -U [dirección]

Por defecto updatedb guarda la base de datos en /var/lib/mlocate/mlocate.db pero podemos especificarle dónde queremos guardar esa base de datos de la siguiente manera:

# updatedb -o [nombre_fichero]

Por lo que si queremos compartir con algún amigo la información de las cosas que tenemos en cierto directorio de nuestra computadora, debemos escribir el siguiente comando:

$ updatedb -l 0 -o [nombre_base_dato] -U [directorio]

La opción “-l 0” es importante si queremos compartir nuestra base de datos, no me voy a detener en esto para no hacer más extenso el artículo, propongo leer el man. En éste caso, no hay que ejecutarlo como root.

Ahora sólo nos falta saber cómo leer de esa base de datos. Pues si creyeron que updatedb era sencillo, pues esto es mucho más sencillo aún. Para esto vamos a usar locate (como todos se imaginaban). Es simplemente hacer lo siguiente:

$ locate -b teléf*txt

Como pueden ver, se pueden utilizar expresiones regulares. La opción -b (o –basename) se la puse para que no incluya los directorios padres en el patrón de búsqueda, o sea, solo coincidan los nombres de los archivos como tal. Por defecto (como es evidente), locate utiliza la base de datos que está en /var/lib/mlocate/mlocate.db. Pero si queremos especificarle una base de datos hecha previamente con updatedb, solo tenemos que agregar la opción -d (o –database). Ejemplo:

$ locate -b teléf*txt -d memoria.db

Lo interesante es que nos podemos quedar con esas bases de datos por un largo tiempo sin actualizarlas, ya que locate tiene una opción que nos da sólo los resultados que están en la base de datos que coinciden con el patrón de búsqueda, y que además existen físicamente. Esa opción es -e (o –existing).

Ahora, conociendo lo básico, son libres de jugar con updatedb y locate todo lo que deseen. Estos dos comandos tienen muchas otras opciones interesantísimas, por lo que les aconsejo consultar sus respectivas entradas en el man. Espero que les haya gustado este artículo y les sea útil en algún momento.

¿Te resultó interesante? Compártelo ...



Ph4nt0m

Publicado por Ph4nt0m

Forma parte de GUTL desde el 8 agosto, 2013. Mi primera distribución GNU/Linux fue un Knoppix cuando estaba en la secundaria. Hoy estudio Ciencias de la Computación (conocida como Cibernética) en la Universidad de La Habana.

Este artículo tiene 10 comentarios

  1. Genial! Yo uso Google Desktop para esto, pero updatedb y locate, aunque no tienen GUI, son una buena alternativa libre.

  2. Genial, la combinacion de updatedb y locate. Aparte de Google Desktop, alguien sabe de otra variante que aparesca en el repo?

    OT: Como puedo comunicarme con el creador del tutorial hospedado en la wiki sobre instalar y tunear OpenBox?

    • Erki:

      Recoll es otra opción a considerar. Está en los repos de Debian y Ubuntu.

      Con toda consideración,

    • Quizas no haya sido yo quien puso lo de la Wiki pero fui quien puso lo del articulo en el portal sobre Openbox

    • Yo uso Ubuntu 13.04, y no encontré ninguno de esos comandos que dices. Incluso hice apt-cache search (o aptitude search), y tampoco encontré ninguna aplicación con esos nombres en el repo. Tal vez son comandos específicos para la familia de Fedora.

      • en /etc/updatedb.conf le dices que nombres ignorar para que no indexe lugares que no te interesan y así los tiempos de indexación disminuyen considerablemente.

        PRUNENAMES = «.git .hg .svn»
        PRUNEPATHS = «/afs /media /net /sfs /tmp /udev /mnt/data/datos_q_no_quiero_indexar …..etc «

Los comentarios están cerrados.