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.
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 primerosNresultados 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$'
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
locateporque 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 deNdirectorios (la ruta inicial es el nivel 1).-mindepth N: Comienza a buscar a partir de una profundidad deNdirectorios.-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 conPATRÓ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íficoN.-samefile NOMBRE: Busca archivos con el mismo inodo queNOMBRE.-links N: Busca archivos con exactamenteNenlaces duros.-regex "PATRÓN": Busca archivos cuya ruta completa coincida con la expresión regularPATRÓ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.+10Mbusca mayores de 10 MB).-#UNIDAD: Busca archivos con tamaño menor que#UNIDAD(ej.-6kbusca 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 EXACTAMENTEMODO(ej.-perm 644).-perm /MODO: Busca archivos que tengan CUALQUIERA de los bits de permiso establecidos enMODO(relación OR). Si algún permiso de los especificados está presente, el archivo coincide. (Ej:-perm /222encuentra archivos que cualquier usuario pueda escribir).-perm -MODO: Busca archivos que tengan TODOS los bits de permiso establecidos enMODO(relación AND). Todos los permisos especificados deben estar presentes. (Ej:-perm -222busca 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 als -lids.-delete: Elimina los archivos encontrados. ¡Usar con extrema precaución!-fls ARCHIVO: Guarda la información detallada de los archivos enconttrados en elARCHIVOespecificado.-ok COMANDO {} \;: EjecutaCOMANDOpara cada archivo encontrado, solicitando confirmación del usuario antes de cada ejecución.-exec COMANDO {} \;: EjecutaCOMANDOpara 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 {} \;
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