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 find
Befehl nicht gerne für diesen Zweck, da sonst nicht alle möglichen Apps gefunden werden, oder es wird ewig dauern.
Es gibt zwar lsregister -dump
Apps, 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, xargs
aber das funktioniert nicht mit den Leerzeichen in den Pfaden.
quelle
*.app/Contents/Info.plist
Datei lesen . Ich werde eine Antwort mit Details geben.defaults
ist dein Freund;)Antworten:
Eine Lösung mit
mdfind
undmdls
als Einzeiler:Dies würde drucken (wenn sowohl Office 2008 als auch 2011 installiert sind):
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.
quelle
Sie können schnell feststellen, welche Version für alle Apps aus einem bestimmten Ordner installiert ist.
Ein Beispiel nehmen, Ordner / Applications :
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
find
Suche.Irgendetwas davon:
find /Applications/*Word/Contents -iname "Info.plist" -maxdepth 1 ...
Um dies zu verwenden, müssen Sie nur den Ordner der App kennen.
quelle
find
ist keine gute Lösung. Und es ist langsam, worauf ich bereits hingewiesen habe, sowie ein No-Go.mdfind
(oder irgendetwas anderem) befindet, renn einfach losdefaults read /full/path/toAn.app/Contents/Info.plist CFBundleVersion
und 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?Die Version könnte so einfach sein wie:
Der Fund ist auch mit spotlight einfach:
Oben habe ich nur die ersten 10 Antworten mit dem
| head
Befehl 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.quelle
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