Finden Sie bestimmte Apps anhand des Namens und der Version über die Befehlszeile

1

Für ein Tool zum Sammeln von Supportinformationen möchte ich in der Lage sein, mehrere Apps nach Namen (oder besser nach ihrer Bundle-ID) zu suchen und ihre Versionen abzurufen.

Ich verwende den findBefehl nicht gerne für diesen Zweck, da sonst nicht alle möglichen Apps gefunden werden, oder es wird ewig dauern.

Es gibt zwar lsregister -dumpApps, die mich interessieren, aber dieser Befehl bietet anscheinend keine Möglichkeit, nur Informationen zu bestimmten Apps abzurufen. Ich müsste das Ergebnis mit grep filtern, kann aber nicht herausfinden, wie es gefiltert werden soll, damit ich nach der Bundle-ID einer App suchen und auch die Version abrufen kann (die in einer anderen Zeile angezeigt wird).

Es gibt auch mdfind, die für meinen Zweck geeignet sein könnten.

Nehmen wir zum Beispiel an, ich möchte Informationen zu allen installierten "Word" -Anwendungen erhalten, z. B. zu den Versionen 2008, 2011 und 365.

Mit lsregister -dump | grep 'com\.microsoft\.Word'würde ich diese Zeilen bekommen:

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

Es ist nicht hilfreich, die Version anzufragen, oder?

Mit mdfind "kMDItemCFBundleIdentifier == com.microsoft.Word"würde ich die Pfade bekommen:

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

Aber wie würde ich die Version daraus bekommen? Ich dachte, ich würde die resultierenden Pfade mit filtern, xargsaber das funktioniert nicht mit den Leerzeichen in den Pfaden.

Thomas Tempelmann
quelle
Sie können aus der *.app/Contents/Info.plistDatei lesen . Ich werde eine Antwort mit Details geben.
Vagner
Das Parsen der Info.plist ist allerdings übertrieben.
Thomas Tempelmann
defaultsist dein Freund;)
Vagner

Antworten:

2

Eine Lösung mit mdfindund mdlsals Einzeiler:

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

Dies würde drucken (wenn sowohl Office 2008 als auch 2011 installiert sind):

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

Das ist gut genug für meine Bedürfnisse. Ich frage mich immer noch, ob es eine Möglichkeit gibt, die Informationen von lsregister oder einem ähnlichen Tool abzurufen, das sich mit der Registrierung von Launch Services befasst.

Thomas Tempelmann
quelle
1

Sie können schnell feststellen, welche Version für alle Apps aus einem bestimmten Ordner installiert ist.

Ein Beispiel nehmen, Ordner / Applications :

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

Hiermit werden Name und Version der App gedruckt.

So drucken Sie den Namen der App:
defaults read nameOf.app/Contents/Info.plist CFBundleExecutable

So drucken Sie die Version der App:
defaults read nameOf.app/Contents/Info.plist CFBundleVersion

Wenn Sie nur eine bestimmte App benötigen, ändern Sie einfach die findSuche.

Irgendetwas davon:

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

Um dies zu verwenden, müssen Sie nur den Ordner der App kennen.

Vagner
quelle
Ja, das funktioniert, aber das habe ich überhaupt nicht gefragt oder beabsichtigt. Ein Benutzer kann die App an einer beliebigen Stelle platzieren, nicht nur im Apps-Ordner. Möglicherweise befindet es sich sogar auf einem anderen Volume. Daher findist keine gute Lösung. Und es ist langsam, worauf ich bereits hingewiesen habe, sowie ein No-Go.
Thomas Tempelmann
1
@ThomasTempelmann, das weiß ich, aber sobald du herausfindest, wo sich die .app mit mdfind(oder irgendetwas anderem) befindet, renn einfach los defaults read /full/path/toAn.app/Contents/Info.plist CFBundleVersionund du bekommst die Version, wie ich als Kommentar in unserer Frage gezeigt habe. Ich habe verstanden, dass das Hauptproblem darin besteht, die Version der App abzurufen, nicht den Standort. Recht?
Vagner
0

Die Version könnte so einfach sein wie:

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

Der Fund ist auch mit spotlight einfach:

mdfind "kMDItemKind == 'Application'" | head

Oben habe ich nur die ersten 10 Antworten mit dem | headBefehl bekommen. Sie müssten eine Skriptsprache oder -sprache auswählen, um die Weitergabe der Ergebnisse vom Fund bis zur Überprüfung der Version zu gewährleisten. Oder Sie könnten sie in temporären Dateien ablegen. Sie müssen mit Leerzeichen in den Dateinamen umgehen oder nur Dinge kopieren / einfügen, sobald Sie sehen, welche Liste von Apps Sie benötigen.

bmike
quelle
Ja, ich könnte es benutzen mdls, um die Version zu bekommen. Aber wie komme ich zum Pfad, wenn ich ihn nicht kenne? Ich möchte eine App finden, die mit einer bestimmten Paket-ID übereinstimmt, nicht mit einem fest codierten Pfad. Und ich mag kein Shell-Scripting, also bin ich immer noch nicht sicher, wie ich die Liste der Pfade an mdls weitergeben soll
Thomas Tempelmann,
@bmike Sie wollen mehr oder weniger die Seite des Ausgabekopf , den die ersten 10 Zeilen standardmäßig nimmt
Mark