Trova app specifiche per nome, ottenendo la loro versione, tramite la riga di comando

1

Per uno strumento di raccolta delle informazioni di supporto, mi piace essere in grado di cercare diverse app per nome (o meglio per il loro ID bundle) e recuperare le loro versioni.

Non mi piace utilizzare il comando find per questo perché non troverà tutte le app possibili, o ci vorrà per sempre.

C'è lsregister -dump , che conosce tutte quelle app che mi interessano, ma quel comando sembra non offrire alcuna opzione per cercare informazioni solo su app specifiche. Dovrei filtrare il risultato con grep, ma non riesco a capire come filtrarlo in modo da poter cercare l'ID bundle di un'app ma anche ottenere la versione (che appare in una linea diversa).

C'è anche mdfind , che potrebbe essere adatto al mio scopo.

Diciamo, per esempio, che voglio sapere di tutte le app "Word" installate, come le versioni 2008, 2011 e 365.

Con lsregister -dump | grep 'com\.microsoft\.Word' , otterrei queste righe:

identifier:    com.microsoft.Word (0x800460c2)
activityTypes: NOTIFICATION#:com.microsoft.Word, pv-e851f8544284d1

Non è utile informarsi sulla versione, vero?

Con mdfind "kMDItemCFBundleIdentifier == com.microsoft.Word" otterrei i percorsi:

/Applications/Microsoft Office 2008/Microsoft Word.app
/Applications/Microsoft Office 2011/Microsoft Word.app

Ma come potrei ottenere la versione da quella? Ho pensato di filtrare i percorsi risultanti con xargs ma non funziona con gli spazi nei percorsi.

    
posta Thomas Tempelmann 14.11.2016 - 16:22
fonte

3 risposte

2

Una soluzione che utilizza mdfind e mdls come monolinea:

mdfind "kMDItemCFBundleIdentifier == com.microsoft.Word" | while IFS= read -r path ; do echo "$path"; mdls -name kMDItemVersion "$path"; done

Ciò verrebbe stampato (se sono installati sia Office 2008 che 2011):

/Applications/Microsoft Office 2008/Microsoft Word.app
kMDItemVersion = "12.3.6"
/Applications/Microsoft Office 2011/Microsoft Word.app
kMDItemVersion = "14.6.9"

Questo è abbastanza buono per i miei bisogni. Mi chiedo ancora se c'è un modo per ottenere le informazioni da lsregister o uno strumento simile che esamina il registro dei servizi di avvio.

    
risposta data 14.11.2016 - 17:09
fonte
1

C'è un modo rapido per cercare quale versione è installata per tutte le app da una particolare cartella.

Prendendo esempio, / Applicazioni cartella:

find /Applications/*/Contents -iname "Info.plist" -maxdepth 1 -exec defaults read {} CFBundleExecutable \; -exec defaults read {} CFBundleVersion \;

Questo stamperà il nome e la versione dell'app.

Per stampare il nome dell'app:
defaults read nameOf.app/Contents/Info.plist CFBundleExecutable

Per stampare la versione dell'app:
defaults read nameOf.app/Contents/Info.plist CFBundleVersion

Se ti serve solo per una particolare app, modifica solo find search.

Qualsiasi cosa del genere:

find /Applications/*Word/Contents -iname "Info.plist" -maxdepth 1 ...

Per utilizzarlo, devi solo conoscere la posizione della cartella dell'app.

    
risposta data 14.11.2016 - 17:45
fonte
0

La versione potrebbe essere facile come:

mdls -name kMDItemVersion /Applications/Microsoft\ Word.app/

Il ritrovamento è anche facile con riflettori:

mdfind "kMDItemKind == 'Application'" | head

Sopra ho ottenuto solo le prime 10 risposte con il comando | head . Dovresti scegliere un linguaggio o un linguaggio di scripting per gestire il passaggio dei risultati dalla ricerca all'esame della versione. O potresti metterli in file temporanei. Dovrai gestire gli spazi nei nomi dei file o semplicemente copiare / incollare le cose una volta che hai visualizzato l'elenco di app di cui hai bisogno.

    
risposta data 14.11.2016 - 16:44
fonte

Leggi altre domande sui tag