Nicola D'Agostino (.net) - Articoli, traduzioni, grafica, web

Metadati a rapporto!

Addentriamoci nel comando mdfind via Terminale: per ricercare e gestire contenuti specifici sul nostro Macintosh.

di Nicola D’Agostino

La funzione di ricerca contestuale e in tempo reale Spotlight di Mac OS X ha una controparte che si chiama mdfind e si può usare da linea di comando, nel Terminale.
Seppure meno immediato rispetto a Spotlight, mdfind offre operatori booleani, la possibilità di essere usato in script ed altre finezze che lo possono far preferire ad una consueta ricerca nell’interfaccia grafica.

Con mdfind Apple ha realizzato uno strumento che va al di là di comandi classici e già apprezzati come find o locate. Il vantaggio principale rispetto a quest’ultimo è l’aggiornamento dinamico dell’indice dei file e il fatto che mdfind (e Spotlight) possono guardare nel contenuto dei file testuali. E nei metadati.

Oltre i dati

Apple ha una storia molto prestigiosa nell’offerta di informazioni aggiuntive sui file tant’è che prima di Mac OS X ogni file era composto da due fork di cui uno poteva rappresentare una fetta anche sostanziale del file (ad esempio nei programmi o nei font).

Spotlight si inserisce in questa tradizione e consiste in un metadata-store ed un content index costantemente aggiornati (a meno che non gli si dica di non farlo). I metadati possono e sono spesso estremamente specifici: un log di iChat verrà gestito in modo diverso da un file audio di iTunes o da una foto in Jpeg. Ad esempio dell’ultimo grazie ai metadati si possono venire a sapere informazioni come “Dimensions” “Color Space” mentre i brani possono avere allegati metadati come “Genre”, “Bit-Rate” o “Encoding”.

Carta di (meta)identità

Il modo migliore per dare un’occhiata ai metadati associati nei file (per poi richiamarli) è usare il comando
mdls nomefile
Ecco ad esempio il risultato di un mdls su un file html


DerVentilator:~/Desktop nda$ mdls extra.html
extra.html -------------
kMDItemAttributeChangeDate = 2008-03-20 00:38:14 +0100
kMDItemContentCreationDate = 2005-11-21 13:58:47 +0100
kMDItemContentModificationDate = 2008-03-20 00:38:14 +0100
kMDItemContentType = "public.html"
kMDItemContentTypeTree = ("public.html", "public.text", "public.data", "public.item", "public.content")
kMDItemDisplayName = "extra.html"
kMDItemFinderComment = "https://www.nicoladagostino.net/info.html"
kMDItemFSContentChangeDate = 2008-03-20 00:38:14 +0100
kMDItemFSCreationDate = 2005-11-21 13:58:47 +0100
kMDItemFSCreatorCode = 0
kMDItemFSFinderFlags = 0
kMDItemFSInvisible = 0
kMDItemFSIsExtensionHidden = 0
kMDItemFSLabel = 0
kMDItemFSName = "extra.html"
kMDItemFSNodeCount = 0
kMDItemFSOwnerGroupID = 501
kMDItemFSOwnerUserID = 501
kMDItemFSSize = 5694
kMDItemFSTypeCode = 0
kMDItemID = 13871979
kMDItemKeywords = (Nicola, "D'Agostino")
kMDItemKind = "Documento HTML"
kMDItemLastUsedDate = 2008-03-20 00:25:32 +0100
kMDItemTitle = " NicolaD'Agostino.net : extra "
kMDItemUsedDates = (2008-03-20 00:25:16 +0100, 2008-03-19 01:00:00 +0100)

Proviamo lo stesso ma su un file JPEG (mostrando solo le prime righe del risultato):


DerVentilator:~/Desktop nda$ mdls grounding.jpg
grounding.jpg -------------
kMDItemAttributeChangeDate = 2008-03-10 11:21:49 +0100
kMDItemBitsPerSample = 32
kMDItemColorSpace = "RGB"
kMDItemContentCreationDate = 2008-03-10 11:21:49 +0100
kMDItemContentModificationDate = 2008-03-10 11:21:49 +0100
kMDItemContentType = "public.jpeg"
kMDItemContentTypeTree = ("public.jpeg", "public.image", "public.data", "public.item", "public.content")
kMDItemDisplayName = "grounding.jpg"
kMDItemFSContentChangeDate = 2008-03-10 11:21:49 +0100
kMDItemFSCreationDate = 2008-03-10 11:21:49 +0100
[...]

È bene ricordare che Spotlight è presente anche in Mac OS X 10.4 ma rispetto al 10.5 il numero di metadati e quindi l’uso che se ne può fare è più limitato: in Leopard tutto Spotlight con i suoi meccanismi sono stati rivisti ed espansi da Apple.

Mdfind in azione

A questo punto diventa facile usare mdfind con i parametri del caso.
Per cercare tutti i file html si potrà dare questo comando

mdfind -onlyin ~/Desktop 'kMDItemContentType == "public.html"'

per l’audio in mp3

mdfind -onlyin ~/Desktop 'kMDItemContentType == "public.mp3"'

mentre per trovare tutte le immagini di tipo JPEG

mdfind -onlyin ~/Desktop 'kMDItemContentType == "public.jpeg"'

I comandi si possono poi concatenare sfruttando più metadati contemporaneamente

mdfind ~/Desktop '((kMDItemContentType == "public.tiff")
&& (kMDItemColorSpace == "CMYK"))'

cerca tutti i file TIFF che siano anche in quadricromia (CMYK)

E dopo mdfind?

Image Events, il programma che invoca sips in Mac OS XUn esempio per sfruttare i risultati forniti da mdfind con altre utility nella shell ce lo fornisce una lunga guida apparsa su The Unofficial Apple Weblog.

La parte più interessante è quella dedicata al comando sips.

Sips sta per Scriptable Image Processing Server ed è il motore per tutte le operazioni grafiche a livello di sistema sin da Mac OS X 10.4. L’OS accede ed impiega sips attraverso l’agente Image Events (che si trova in /System/Library/CoreServices) per una pletora di compiti, da quelle di modifica (ritaglio, rotazione, ridimensionamento) alla gestione del colore e persino per interagire con i metadati.

Di Sips si può fare uso tramite linguaggi di programmazione e di scripting (come Applescript) o più banalmente dalla linea di comando.
Ad esempio digitando

sips -i miafoto.jpg

si creerà, grazie al flag -i, l’icona di anteprima per il file in formato JPEG “miafoto”. A differenza dalle anteprime nel Finder questo tipo di anteprima è permanente e viene aggiunta al file come fanno i programmi di fotoritocco (ad esempio Photoshop).

una situazione tipica nel Finder: un misto di file con l'anteprima e altri senza

L’unione fa l’anteprima

Creare le anteprime file per file è però un’operazione lunga e macchinosa. Perché non coalizzare sips con la versatilità di mdfind? Detto fatto:

mdfind -onlyin . '((kMDItemFSHasCustomIcon == 0)
&& (kMDItemContentType == "public.jpeg"))'|awk '{gsub(/ /,"\\ ");system("sips -i " $0);}'

Il risultato sarà una scansione tramite mdfind dei file nella directory in cui ci si trova e delle sottodirectory (il -onlyin .) che NON hanno una icona di anteprima (dove kMDItemFSHasCustomIcon equivale a 0, cioè no) e che sono in formato jpeg (individuati grazie a kMDItemContentType). Il risultato è passato con una pipe al comando awk per gestire e risolvere gli spazi nel percorso dei file e poi è il momento di gloria del già visto comando sips -i

Se si vuole applicare l’anteprima a tutti file jpg basta eliminare la parte -onlyin . ed armarsi di pazienza fino a che questa allegra combriccola avrà passato in rassegna e abbellito tutte le immagini in cui si imbatterà.

mdfind2, la vendetta

Di mdfind esiste un interessante rimpiazzo dal fantasioso nome di…mdfind2. Questa versione aggiunge una funzione che manca allo strumento di Apple, la generazione dei risultati come file XML, comodo per elaborare e trasformare i risultati.
Usando il flag –xml mdfind2 genera infatti tanti attribute quanti sono i vari kMDItem, ad esempio per la visibilità (o meno) si ottiene
0

Approfondimenti

Apple – Mac OS X Manual Page For mdfind(1)

Using Spotlight from the OS X Commandline

Apple – Introduction to Spotlight Metadata Attributes Reference

Apple – Mac OS X Manual Page For sips

Apple Technical Note TN2035- ColorSync on Mac OS X – SIPS

Informazioni e possibili utilizzi di mdfind2

Una versione di questo articolo è stata pubblicata su "Hacker Journal" n. 150 dell’aprile 2008