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
mlocateestá instalado consultando su directorio: - Si el directorio no existe o el comando
locateno funciona, instala el paquete con privilegios de administrador: - Comprueba que se ha creado la base de datos de
locate: - Si no aparece el fichero
mlocate.db, actualiza manualmente la base de datos con privilegios de administrador:
cd /var/lib/mlocate
sudo apt-get install mlocate
ls -l
sudo updatedb
Fase 2: Búsquedas básicas con locate
- Busca ficheros y directorios cuyo nombre contenga la palabra
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: - Observa que aparecen resultados que empiezan, terminan o contienen dicho término en cualquier parte del nombre.
locate mkdir
locate useradd
Fase 3: Filtrar resultados con locate
- Busca todos los resultados que contengan la palabra
javaen cualquier parte de la ruta: - Repite la búsqueda limitando los resultados a aquellos en los que
javaaparece al final del nombre del fichero: - Compara ambos resultados y observa que la segunda búsqueda excluye ficheros como los relacionados con
javascript.
locate java
locate -b java
Fase 4: Contar resultados con locate
- Cuenta cuántos resultados totales contienen la palabra
javaen el sistema: - Cuenta ahora cuántos resultados terminan exactamente en
java: - Compara ambos números obtenidos.
locate -c java
locate -bc java
Fase 5: Búsquedas básicas con find
- Accede al directorio
/bin: - Busca, a partir del directorio actual, todos los ficheros cuyo nombre sea exactamente
f: - Busca ahora todos los ficheros cuyo nombre empiece por
f: - Busca todos los ficheros que contengan una
fen cualquier parte de su nombre:
cd /bin
find . -name "f"
find . -name "f*"
find . -name "*f*"
Fase 6: Uso de find en directorios con restricciones de permisos
- Accede al directorio raíz del sistema de ficheros:
- Busca desde ese punto todos los ficheros que contengan una
fen su nombre: - Observa los mensajes de permiso denegado que aparecen para aquellos directorios a los que tu usuario no tiene acceso.
- Accede al directorio
/etcy repite la búsqueda:
cd /
find . -name "*f*"
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 unaf: - Cuenta cuántos ficheros contienen una
fen su nombre, combinandofindcon una tubería: - Observa que el resultado incluye también los mensajes de error correspondientes a los directorios sin permiso de acceso.
find . -not -name "*f*"
find . -name "*f*" | wc -l
Preguntas de reflexión:
- ¿Por qué el comando
locatees mucho más rápido que el comandofinda la hora de buscar ficheros? - ¿Qué inconveniente tiene el hecho de que
locatebusque en una base de datos en lugar de buscar directamente en el sistema de ficheros? - ¿Para qué sirve el comando
updatedby por qué normalmente requiere privilegios de administrador? - ¿Qué diferencia hay entre ejecutar
locate javaylocate -b java? - ¿Qué formato básico tiene el comando
find? Indica sus tres partes principales. - ¿Qué diferencia existe entre
find . -name "f",find . -name "f*"yfind . -name "*f*"? - ¿Por qué al ejecutar
finddesde el directorio raíz (/) pueden aparecer mensajes de permiso denegado? - ¿Qué diferencia práctica existe entre utilizar
lscon un patrón y utilizarfindcon la opción-name? - ¿Para qué sirve la opción
-noten el comandofind? - ¿Por qué se recomienda ser prudente al ejecutar
finddesde 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:
- Rellena los campos y responde en este formulario desde tu navegador.
- Pulsa el botón de imprimir al final de la página.
- Selecciona "Guardar como PDF" en el diálogo de impresión.
- Entrega el archivo PDF en el aula virtual.
Alumno/a: Fecha:
Grupo:
Completa la ficha realizando las siguientes actividades:
- Comprueba que
locateestá 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:
- Busca con
locateficheros que contengan la palabrajava, 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:
- 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:
- Utiliza
finden/binpara buscar ficheros con distintos patrones de nombre.
Escribe los tres comandos utilizados (nombre exacto, empieza por, contiene):
Copia aquí algunos de los resultados obtenidos:
- Ejecuta
finddesde el directorio/etcy 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:
- Utiliza
findcon-noty 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-noten este contexto: