¿Cómo derivan mdfind y mdls qué metadatos tiene un archivo y dónde se almacena?

La página man de mdfinddice lo siguiente:

El comando mdfind consulta el almacén central de metadatos y devuelve una lista de archivos que coinciden con la consulta de metadatos dada. La consulta puede ser una cadena o una expresión de consulta.

Uno supondría que el "almacén central de metadatos" hace referencia store.dba .Spotlight-V100(como se indica en esta respuesta ), pero mdls, que supongo que usa el mismo "almacén central de metadatos", parece funcionar bien sin ninguno de los archivos de Spotlight presentes. Probé el siguiente comando en Catalina (10.15.7) y no hubo demora en mostrar el resultado de mdls, lo que indica que el comando no utiliza Spotlight DB.

sudo rm -rf /System/Volumes/Data/.Spotlight-V100 ~/Library/Metadata/CoreSpotlight/ 
mdls ~/Downloads/MacVim.dmg

El uso manual de Spotlight, CommandSpacepor otro lado, inicia muchos mdworker_sharedprocesos y vuelve a crear el .Spotlight-V100directorio.

Tampoco veo cómo mdlsy mdfindpodría estar usando atributos extendidos, como se indica en esta respuesta , ya que la invocación xattr -l ~/Downloads/MacVim.dmgno produce ningún resultado mientras mdls ~/Downloads/MacVim.dmgmuestra varios kMD*atributos.

Respuestas (1)

mdfindconsulta la base de datos de Spotlight para proporcionar resultados de búsqueda más rápido que escanear todo el sistema de archivos para cada consulta.

mdlspor otro lado, no se basa en la base de datos de Spotlight, ya que no necesita escanear el sistema de archivos: está especificando el archivo que desea examinar directamente. Sin embargo, se basa en la API de Spotlight para proporcionar los datos solicitados.

Es decir, mdlsno es un programa que contiene código que intenta "analizar" todo tipo de tipos de archivos o recopilar información de muchos lugares. Tampoco lo busca directamente en el store.dbarchivo.

Cuando solicita los metadatos para un archivo específico a través de la API de Spotlight, la información se recopila de varios lugares y se entrega al programa ( mdlsen este caso) en un formato uniforme. Estas fuentes son por ejemplo:

  • los metadatos del sistema de archivos
  • los atributos extendidos almacenados en el sistema de archivos
  • información de paquetes de aplicaciones y lugares similares
  • información recopilada por el complemento importador de Spotlight para el tipo de archivo específico

Tenga en cuenta que algunos complementos de importación son externos, es decir, pequeños programas almacenados por separado del propio Spotlight. Por ejemplo, /System/Library/Spotlightnormalmente encontrará importadores para cosas como archivos de audio, archivos de video, archivos comprimidos, etc. De manera similar, las aplicaciones pueden venir con sus propios importadores de Spotlight, almacenados en ubicaciones como, por ejemplo:

/Applications/Microsoft Outlook.app/Contents/Library/Spotlight/Microsoft Outlook Spotlight Importer.mdimporter

En este caso para importar datos de Outlook a Spotlight.

Otros complementos son internos, es decir, están incluidos en Spotlight y no requieren programas externos. Su ejemplo en la pregunta fue para un .dmgarchivo, y el importador para esos es interno.

Puede ejecutar el importador para un archivo específico para ver exactamente qué atributos le habría dado al índice de Spotlight, sin cambiar realmente el índice de Spotlight. Ejecute un comando como este:

mdimport -t -d2 ~/Downloads/MacVim.dmg

Tenga en cuenta que eso -d2significa que verá todos los atributos de metadatos importados, excepto kMDItemTextContentlos que, en el caso de un documento, suelen ser muy grandes y no es preferible verlos en una salida de Terminal. También puede ver ese atributo usando el -d3argumento en su lugar.

Como estos importadores se ejecutan efectivamente como programas de propósito general, las fuentes de datos para los propios importadores pueden ser casi cualquier cosa. Es decir, no se limita a devolver los datos que se encuentran en el propio sistema de archivos; incluso podría proporcionar atributos encontrados consultando servidores en la nube a través de la red (por ejemplo, cuando tiene un archivo almacenado en iCloud).