-->

Búsqueda de ficheros con locate y find

Objetivo:

Aprender a buscar ficheros y directorios en Linux utilizando los comandos locate y find, comprendiendo la diferencia de funcionamiento entre ambos, y practicar el uso de patrones de búsqueda y algunas de sus opciones más habituales.

Escenario:

  • Herramientas: Terminal de Linux y un sistema Debian o basado en Debian.
  • Conceptos clave: locate, updatedb, find, patrón de búsqueda, comodines, permisos de acceso a directorios.

Instrucciones:

Fase 1: Instalación y actualización de locate

  • Comprueba si el paquete mlocate está instalado consultando su directorio:
  • cd /var/lib/mlocate
  • Si el directorio no existe o el comando locate no funciona, instala el paquete con privilegios de administrador:
  • sudo apt-get install mlocate
  • Comprueba que se ha creado la base de datos de locate:
  • ls -l
  • Si no aparece el fichero mlocate.db, actualiza manualmente la base de datos con privilegios de administrador:
  • sudo updatedb

Fase 2: Búsquedas básicas con locate

  • Busca ficheros y directorios cuyo nombre contenga la palabra mkdir:
  • locate mkdir
  • Observa que el resultado incluye no solo el comando mkdir, sino cualquier fichero o directorio cuyo nombre contenga ese patrón.
  • Busca ahora ficheros y directorios que contengan la palabra useradd:
  • locate useradd
  • Observa que aparecen resultados que empiezan, terminan o contienen dicho término en cualquier parte del nombre.

Fase 3: Filtrar resultados con locate

  • Busca todos los resultados que contengan la palabra java en cualquier parte de la ruta:
  • locate java
  • Repite la búsqueda limitando los resultados a aquellos en los que java aparece al final del nombre del fichero:
  • locate -b java
  • Compara ambos resultados y observa que la segunda búsqueda excluye ficheros como los relacionados con javascript.

Fase 4: Contar resultados con locate

  • Cuenta cuántos resultados totales contienen la palabra java en el sistema:
  • locate -c java
  • Cuenta ahora cuántos resultados terminan exactamente en java:
  • locate -bc java
  • Compara ambos números obtenidos.

Fase 5: Búsquedas básicas con find

  • Accede al directorio /bin:
  • cd /bin
  • Busca, a partir del directorio actual, todos los ficheros cuyo nombre sea exactamente f:
  • find . -name "f"
  • Busca ahora todos los ficheros cuyo nombre empiece por f:
  • find . -name "f*"
  • Busca todos los ficheros que contengan una f en cualquier parte de su nombre:
  • find . -name "*f*"

Fase 6: Uso de find en directorios con restricciones de permisos

  • Accede al directorio raíz del sistema de ficheros:
  • cd /
  • Busca desde ese punto todos los ficheros que contengan una f en su nombre:
  • find . -name "*f*"
  • Observa los mensajes de permiso denegado que aparecen para aquellos directorios a los que tu usuario no tiene acceso.
  • Accede al directorio /etc y repite la búsqueda:
  • cd /etc
    find . -name "*f*"

Fase 7: Excluir resultados y contar coincidencias con find

  • Desde el directorio /etc, busca todos los ficheros cuyo nombre no contenga una f:
  • find . -not -name "*f*"
  • Cuenta cuántos ficheros contienen una f en su nombre, combinando find con una tubería:
  • find . -name "*f*" | wc -l
  • Observa que el resultado incluye también los mensajes de error correspondientes a los directorios sin permiso de acceso.

Preguntas de reflexión:

  1. ¿Por qué el comando locate es mucho más rápido que el comando find a la hora de buscar ficheros?
  2. ¿Qué inconveniente tiene el hecho de que locate busque en una base de datos en lugar de buscar directamente en el sistema de ficheros?
  3. ¿Para qué sirve el comando updatedb y por qué normalmente requiere privilegios de administrador?
  4. ¿Qué diferencia hay entre ejecutar locate java y locate -b java?
  5. ¿Qué formato básico tiene el comando find? Indica sus tres partes principales.
  6. ¿Qué diferencia existe entre find . -name "f", find . -name "f*" y find . -name "*f*"?
  7. ¿Por qué al ejecutar find desde el directorio raíz (/) pueden aparecer mensajes de permiso denegado?
  8. ¿Qué diferencia práctica existe entre utilizar ls con un patrón y utilizar find con la opción -name?
  9. ¿Para qué sirve la opción -not en el comando find?
  10. ¿Por qué se recomienda ser prudente al ejecutar find desde el directorio raíz del sistema?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Por qué el comando locate es mucho más rápido que el comando find a la hora de buscar ficheros?

Porque locate no recorre el sistema de ficheros en el momento de la búsqueda, sino que consulta una base de datos previamente generada, lo que hace que la respuesta sea prácticamente instantánea.


2. ¿Qué inconveniente tiene el hecho de que locate busque en una base de datos en lugar de buscar directamente en el sistema de ficheros?

Que los ficheros creados después de la última actualización de la base de datos no aparecerán en los resultados hasta que dicha base de datos se actualice.


3. ¿Para qué sirve el comando updatedb y por qué normalmente requiere privilegios de administrador?

updatedb actualiza la base de datos que utiliza locate para realizar sus búsquedas. Requiere privilegios de administrador porque implica recorrer todo el sistema de ficheros y actualizar un fichero de sistema compartido por todos los usuarios.


4. ¿Qué diferencia hay entre ejecutar locate java y locate -b java?

locate java busca el patrón java en cualquier parte de la ruta completa del fichero, mientras que locate -b java limita la búsqueda a que el patrón aparezca al final del nombre del fichero, excluyendo así resultados no deseados como javascript.


5. ¿Qué formato básico tiene el comando find? Indica sus tres partes principales.

El formato básico es: directorio de inicio (dónde empezar a buscar), opciones (qué tipo de búsqueda realizar) y término de búsqueda (qué se está buscando).


6. ¿Qué diferencia existe entre find . -name "f", find . -name "f*" y find . -name "*f*"?

find . -name "f" busca ficheros cuyo nombre sea exactamente f. find . -name "f*" busca ficheros cuyo nombre empiece por f. find . -name "*f*" busca ficheros que contengan una f en cualquier parte de su nombre.


7. ¿Por qué al ejecutar find desde el directorio raíz pueden aparecer mensajes de permiso denegado?

Porque find recorre realmente el sistema de ficheros, y si el usuario no tiene permisos para acceder a determinados directorios, el sistema deniega la entrada y muestra el correspondiente mensaje de error, independientemente del comando utilizado.


8. ¿Qué diferencia práctica existe entre utilizar ls con un patrón y utilizar find con la opción -name?

ls se limita a listar los ficheros que coinciden con el patrón en el directorio indicado, mientras que find busca de manera recursiva a partir del directorio indicado y, además, permite realizar operaciones adicionales sobre los ficheros encontrados.


9. ¿Para qué sirve la opción -not en el comando find?

Permite invertir la condición de búsqueda, de modo que se muestren los ficheros que no cumplen con el patrón indicado.


10. ¿Por qué se recomienda ser prudente al ejecutar find desde el directorio raíz del sistema?

Porque al recorrer toda la estructura de directorios del sistema, la búsqueda puede tardar mucho tiempo en completarse, por lo que se recomienda acotar la búsqueda a un directorio concreto siempre que sea posible.


Ficha de Laboratorio: Búsqueda de ficheros con locate y find

Instrucciones de entrega:

  1. Rellena los campos y responde en este formulario desde tu navegador.
  2. Pulsa el botón de imprimir al final de la página.
  3. Selecciona "Guardar como PDF" en el diálogo de impresión.
  4. Entrega el archivo PDF en el aula virtual.

Alumno/a:      Fecha:      

Grupo:


Completa la ficha realizando las siguientes actividades:

  1. Comprueba que locate está disponible y actualiza su base de datos.
    Escribe el comando utilizado para actualizar la base de datos:

    Indica si el paquete ya estaba instalado o has tenido que instalarlo:
  2. Busca con locate ficheros que contengan la palabra java, primero sin filtrar y después limitando al final del nombre.
    Escribe ambos comandos utilizados:

    Copia aquí algunos de los resultados obtenidos en cada caso:

    Explica la diferencia entre ambos resultados:
  3. Cuenta cuántos resultados totales y cuántos resultados finales contienen la palabra java.
    Escribe ambos comandos utilizados:

    Copia aquí ambos resultados numéricos obtenidos:
  4. Utiliza find en /bin para buscar ficheros con distintos patrones de nombre.
    Escribe los tres comandos utilizados (nombre exacto, empieza por, contiene):

    Copia aquí algunos de los resultados obtenidos:
  5. Ejecuta find desde el directorio /etc y observa los mensajes de permiso denegado.
    Escribe el comando utilizado:

    Copia aquí algún mensaje de error obtenido:

    Explica por qué se produce este mensaje:
  6. Utiliza find con -not y cuenta los resultados con una tubería.
    Escribe ambos comandos utilizados:

    Copia aquí el número de resultados obtenido:

    Explica qué hace la opción -not en este contexto: