Herramientas de Búsqueda en Linux: locate y find

El sistema operativo Linux ofrece diversas utilidades para localizar archivos. Este artículo se centra en dos de las más comunes y potentes: locate y find.

  1. locate: Búsqueda Rápida Basada en Base de Datos

1.1. Funcionamiento

locate realiza búsquedas no en tiempo real, sino consultando una base de datos preexistente de archivos del sistema. Esta base de datos, típicamente ubicada en /var/lib/mlocate/mlocate.db, contiene información sobre la ubicación de todos los archivos. Si este archivo se elimina, locate dejará de funcionar hasta que la base de datos sea reconsturida manualmente con el comando updatedb o tras un reinicio del sistema.

La base de datos se actualiza periódicamente de forma automática por el sistema o manualmente por el administrador. La construcción inicial de esta base de datos implica el escaneo completo del sistema de archivos, lo que puede consumir recursos considerables.

1.2. Características Clave

  • Velocidad: Extremadamente rápido debido a la consulta de la base de datos.
  • Flexibilidad: Permite búsquedas amplias.
  • No en tiempo real: La información puede no estar actualizada al instante si el sistema de archivos ha cambiado recientemente.
  • Búsqueda de rutas completas: Busca en la ruta completa de los archivos, no solo en sus nombres.
  • Permisos: Puede estar limitado a directorios y archivos que el usuario tenga permiso para leer y ejecutar.

1.3. Uso del Comando locate

Opciones Útiles

  • -i: Ignora distinciones entre mayúsculas y minúsculas.
  • -n N: Limita la salida a los primeros N resultados coincidentes.
  • -r: Utiliza expresiones regulares para la búsqueda.

Ejemplos

Buscar archivos que contengan "conf" en su nombre o ruta:

locate conf

Buscar archivos que terminen en ".conf" usando una expresión regular:

locate -r '\.conf$'
  1. find: Búsqueda en Tiempo Real y Profunda

find es una herramienta de búsqueda en tiempo real que opera recorriendo el sistema de archivos especificado. Ofrece un control mucho más granular sobre los criterios de búsqueda.

2.1. Características Clave

  • Velocidad: Generalmente más lento que locate porque escanea el disco en tiempo real.
  • Precisión: Permite especificar criterios de búsqueda muy detallados.
  • Tiempo real: Proporciona resultados actualizados al instante.
  • Permisos: Al igual que locate, puede estar restringido por los permisos de acceso del usuario.

2.2. Formato General del Comando find

find [OPCIONES]... [RUTA_DE_BÚSQUEDA] [CRITERIOS_DE_BÚSQUEDA] [ACCIONES_SOBRE_RESULTADOS]

  • Ruta de Búsqueda: El directorio o directorios donde comenzar la búsqueda (por defecto, el directorio actual).
  • Criterios de Búsqueda: Las condiciones que deben cumplir los archivos (nombre, tamaño, tipo, permisos, etc.).
  • Acciones sobre Resultados: Qué hacer con los archivos encontrados (imprimir en pantalla, eliminar, ejecutar un comando, etc. - por defecto, imprimir en pantalla).

2.3. Criterios de Búsqueda

2.3.1. Nivel de Profundidad

  • -maxdepth N: Limita la búsqueda hasta una profundidad de N directorios (la ruta inicial es el nivel 1).
  • -mindepth N: Comienza a buscar a partir de una profundidad de N directorios.
  • -depth: Procesa primero el contenido de un directorio antes que el propio directorio.

2.3.2. Búsqueda por Nombre e Inodo

  • -name "PATRÓN": Busca archivos cuyo nombre coincida con PATRÓN (admite comodines como \*, ?, \[\]).
  • -iname "PATRÓN": Similar a -name, pero ignora mayúsculas y minúsculas.
  • -inum N: Busca archivos con un número de inodo específico N.
  • -samefile NOMBRE: Busca archivos con el mismo inodo que NOMBRE.
  • -links N: Busca archivos con exactamente N enlaces duros.
  • -regex "PATRÓN": Busca archivos cuya ruta completa coincida con la expresión regular PATRÓN.

2.3.3. Búsqueda por Propietario y Grupo

  • -user NOMBRE_USUARIO: Busca archivos propiedad del usuario especificado.
  • -group NOMBRE_GRUPO: Busca archivos propiedad del grupo especificado.
  • -uid ID_USUARIO: Busca archivos propiedad del ID de usuario especificado.
  • -gid ID_GRUPO: Busca archivos propiedad del ID de grupo especificado.
  • -nouser: Busca archivos que no tienen un propietario asignado (inodos huérfanos).
  • -nogroup: Busca archivos que no tienen un grupo asignado.

2.3.4. Búsqueda por Tipo de Archivo

-type TIPO:

  • f: Archivo regular.
  • d: Directorio.
  • l: Enlace simbólico.
  • s: Socket de dominio Unix.
  • b: Dispositivo de bloque.
  • c: Dispositivo de caracteres.
  • p: Tubería con nombre (FIFO).

2.3.5. Archivos o Directorios Vacíos

-empty: Busca archivos o directorios que estén vacíos.

find /ruta/a/buscar -type d -empty  # Busca directorios vacíos
find /ruta/a/buscar -empty         # Busca archivos o directorios vacíos

2.3.6. Combinación de Criterios

  • -a (o implícito): Y lógico (ambas condiciones deben cumplirse).
  • -o: O lógico (al menos una condición debe cumplirse).
  • -not (o !): NO lógico (la condición no debe cumplirse).

Nota: El operador -a tiene mayor precedencia que -o. Para agrupar condiciones lógicas de forma explícita, se usan paréntesis, que a menudo deben escaparse con una barra invertida (\( ... \)).

Ejemplo combinando criterios: Buscar archivos con extensión ".sh" que pertenezcan al usuario "root".

find /ruta/a/buscar -name "*.sh" -a -user root -ls

Ejemplo de Ley de De Morgan:

Buscar archivos que NO sean ".sh" O que NO pertenezcan a "liu":

find /data ! -name "*.sh" -o ! -user liu > f1.txt

Equivalente a: Buscar archivos que NO (sean ".sh" Y pertenezcan a "liu"):

find /data ! \( -name "*.sh" -a -user liu \) > f2.txt

2.3.7. Exclusión de Directorios

Para excluir directorios específicos de la búsqueda, se utiliza la opción -prune.

Buscar archivos *.conf en /etc, excluyendo el directorio /etc/sane.d:

find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"

Buscar archivos *.conf en /etc, excluyendo los directorios /etc/sane.d y /etc/fonts:

find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"

2.3.8. Búsqueda por Tamaño

-size [+/-]#UNIDAD:

  • UNIDAD: c (bytes), k (kilobytes), M (megabytes), G (gigabytes).
  • #UNIDAD: Busca archivos con tamaño exacto (con redondeo).
  • +#UNIDAD: Busca archivos con tamaño mayor que #UNIDAD (ej. +10M busca mayores de 10 MB).
  • -#UNIDAD: Busca archivos con tamaño menor que #UNIDAD (ej. -6k busca menores de 6 KB).

2.3.9. Búsqueda por Tiempos

Basado en días:

  • -atime [+/-]#: Tiempo de último acceso.
  • -mtime [+/-]#: Tiempo de última modificación.
  • -ctime [+/-]#: Tiempo de último cambio de estado (metadatos).

#: Exactamente # días atrás. +#: Más de # días atrás. -#: Menos de # días atrás.

Basado en minutos:

  • -amin, -mmin, -cmin: Similar a los anteriores pero en minutos.

Ejemplo: Buscar archivos accedidos hace más de 2 días:

find / -atime +2

Ejemplo: Buscar archivos modificados en los últimos 3 días:

find / -mtime -3

2.3.10. Búsqueda por Permisos

-perm MODO:

  • -perm MODO: Busca archivos cuyos permisos sean EXACTAMENTE MODO (ej. -perm 644).
  • -perm /MODO: Busca archivos que tengan CUALQUIERA de los bits de permiso establecidos en MODO (relación OR). Si algún permiso de los especificados está presente, el archivo coincide. (Ej: -perm /222 encuentra archivos que cualquier usuario pueda escribir).
  • -perm -MODO: Busca archivos que tengan TODOS los bits de permiso establecidos en MODO (relación AND). Todos los permisos especificados deben estar presentes. (Ej: -perm -222 busca archivos donde el propietario, grupo y otros tengan permiso de escritura).

Nota: El prefijo / es el más comúnmente utilizado para búsquedas flexibles de permisos.

Ejemplo: Buscar archivos donde el "other" tenga permiso de escritura (equivalente a -perm /002):

find . -perm /002
find . -perm /2
find . -perm -002
find . -perm -2

2.4. Acciones sobre los Resultados

  • -print: Muestra la ruta completa de los archivos encontrados en la salida estándar (es la acción por defecto si no se especifica otra).
  • -ls: Muestra información detallada de los archivos encontrados, similar a ls -lids.
  • -delete: Elimina los archivos encontrados. ¡Usar con extrema precaución!
  • -fls ARCHIVO: Guarda la información detallada de los archivos enconttrados en el ARCHIVO especificado.
  • -ok COMANDO {} \;: Ejecuta COMANDO para cada archivo encontrado, solicitando confirmación del usuario antes de cada ejecución.
  • -exec COMANDO {} \;: Ejecuta COMANDO para cada archivo encontrado sin solicitar confirmación (no interactivo). El carácter {} se reemplaza por el nombre del archivo encontrado, y \; marca el final del comando.

Ejemplos de Acciones

Eliminar archivos que no sean directorios y tengan permisos de escritura para otros:

find . ! -type d -perm /222 -delete

Copiar archivos .txt que tengan algún permiso de escritura para otros, a /root (interactivo):

find . -perm /222 -name "*.txt" -ok cp {} /root \;

Mover archivos de datos de más de 10MB a /root:

find /data -size +10M -exec mv {} /root \;

Eliminar archivos de datos de más de 10MB:

find /data -size +10M -exec rm {} \;
  1. xargs: Procesamiento de Listas de Argumentos

El comando xargs se utiliza para construir y ejecutar líneas de comando a partir de la entrada estándar. Es muy útil cuando se necesita procesar una lista de archivos (generada por find u otros comandos) con un comando que no puede manejar múltiples argumentos directamente o cuando la lista es demasiado larga para la línea de comandos.

Ejemplo: Crear 30000 archivos vacíos usando echo y xargs:

echo f{1..30000} | xargs touch

Ejemplo: Eliminar todos los archivos que comienzan con "f" usando find y xargs:

find -name "f*" | xargs rm

Ejemplo: Crear copias de seguridad de archivos de configuración añadiendo la extensión .orig:

find -name "*.conf" -exec cp {} {}.orig \;

Ejemplo: Eliminar archivos temporales de "joe" creados hace más de 3 días (interactivo):

find /tmp -ctime +3 -user joe -ok rm {} \;

Ejemplo: Encontrar archivos en el directorio personnel que otros usuarios puedan escribir y eliminar ese permiso:

find ~ -perm -002 -exec chmod o-w {} \;

Ejemplo: Encontrar archivos regulares en /data con permisos 644 y extensión .sh, y añadirles permiso de ejecución:

find /data -type f -perm 644 -name "*.sh" -exec chmod 755 {} \;

Ejemplo: Listar detalles de todos los directorios dentro de /home:

find /home -type d -ls

Etiquetas: linux comando find locate búsqueda de archivos

Publicado el 6-18 23:59