Wie auch immer, um eine Liste der Anwendungen zu erhalten, die eine Datei über das Terminal öffnen können?

Im Finder können Sie auf ein Dokument klicken, um das Kontextmenü aufzurufen, dieses hat "Öffnen mit ..." mit einem Untermenü aller Apps, die dieses Dokument öffnen können. Gibt es eine Möglichkeit, diese Liste über das Terminal abzurufen? Vielen Dank.

Antworten (2)

Open konsultiert dieselbe Datenbank wie der Finder, um einen Dateityp potenziellen Apps zuzuordnen. Der Name dieser Datenbank ist Launch Serices Database und sie ist ziemlich groß und unhandlich, wenn Sie alles ausgeben.

 lsregister -dump | wc -l

Ich habe 533.000 Textzeilen in meiner Datenbank, daher müssen Sie vielleicht eingrenzen, was Sie suchen, anstatt einfach die gesamte Datenflut über jeden möglichen Dateityp und jede mögliche Anwendung zu verbrauchen. Wenn Sie lsregister nicht in Ihrem Pfad haben, finden Sie es hier und erstellen Sie optional einen symbolischen Link darauf in /usr/local/bin

mdfind -name lsregister
ln -s $(mdfind -name lsregister) /usr/local/bin

Aber wenn Sie die ganze Enchilada wollen, können Sie die Datenbank leeren und sich in die herrlichen technischen Details vertiefen.

Gehen wir noch zwei Schritte den Kaninchenpfad hinunter. Angenommen, Sie haben eine Filmdatei auf Ihrem Desktop. Sie würden das Metadaten-Auflistungstool verwenden, um alle Attribute dieser Datei (61 Einträge für einen Film, den ich habe) auszugeben, und dann müssen Sie den Inhaltstyp analysieren, um ihn mit dem Datenbankauszug von Startdiensten abzugleichen.

mdls ~/Desktop/video.mov | wc -l

Und um nur den spezifischsten Inhaltstyp auszuwählen (da eine Datei einen Baum potenzieller Inhaltstypen hat - müssen Sie sie möglicherweise auch bei Ihrer Suche berücksichtigen - aber da wir dies einfach halten - nehmen wir an, der letzte Typ ist was für Ihren Fall passt)

mdls ~/Desktop/video.mov | grep -w kMDItemContentType

Für mich wird dieser Film also durch die Spotlight-Indizierung als Datei vom Typ com.apple.quicktime-movie und im Dump der Startdienste kategorisiert - eine der Apps, die behauptet, diese Datei zu öffnen, ist /Applications/QuickTime Player.app

Das Erstellen von Skripten wird eine ziemliche Übung, aber die Daten sind für Sie da, damit Sie sie untersuchen und damit spielen können. Genießen!

Diese andere Frage enthält einige großartige Details und ein Tool namens http://duti.org , das möglicherweise das Tool ist, nach dem Sie suchen. Noch besser, es ist Open Source, sodass Sie sehen können, wie es funktioniert.

Meine Lösung hier ähnelt einer Antwort, die ich auf ein Problem gegeben habe, das einige Ähnlichkeiten mit diesem Problem aufweist.

Mit JavaScript for Automation (JXA) können Sie eine Liste von Anwendungen abrufen, die einen bestimmten Inhaltstyp öffnen können, der durch eine einheitliche Typkennung gekennzeichnet ist .

ObjC.import('CoreServices');

const contentType = 'public.plain-text';

ObjC.deepUnwrap(
        $.LSCopyAllRoleHandlersForContentType(
                      contentType,
                      $.kLSRolesAll)
            );

Um dies vom Terminal aus zu verwenden , können Sie es ausführen mit osascript:

osascript -l JavaScript <<OSA
 .
 .
 .
OSA

Der Einfachheit halber möchten Sie vielleicht eine Funktion erstellen bashund den Wert von parametrisieren contentType:

whatOpens() {
    osascript -l JavaScript <<OSA
        ObjC.import('CoreServices');

        ObjC.deepUnwrap(
                $.LSCopyAllRoleHandlersForContentType(
                        "$1",
                        $.kLSRolesAll
                )
        ).map(x=>Application(x).name())
         .join('\n');
OSA
}

Dann:

whatOpens public.plain-text

was auf meinem System ausgibt:

BBEdit
MindNode
Atom
TextEdit
Pages
CotEditor
Numbers
TextMate
Das ist fabelhaft – ich muss mehr über JXA lernen oder lernen, wie ich von Swift auf CoreServices zugreifen kann, also ist es an der Zeit, in die Repl einzutauchen osascript -il JavaScriptund mehr zu lernen.