Bestimmen Sie, ob ein Verzeichnis ein Bündel oder Paket in dem Mac OS X-Terminal ist?
Frage
Ich möchte, wenn ein Verzeichnis wie zum Beispiel eines ‚.app‘ betrachtet wird, um zu bestimmen, in die Lage sein, ein Paket oder Bündel von Finder-Sicht auf der Kommandozeile zu sein. Ich glaube nicht, das wäre schwierig, mit einem kleinen Shell-Programm zu tun, aber ich mag lieber nicht das Rad neu erfinden, wenn ich nicht haben.
Lösung
Update:
Auf allen Systemen mit Spotlight, mdls
verwenden Sie Bündel Blick auf die kMDItemContentTypeTree Eigenschaft erkennen kann. Z.
mdls -name kMDItemContentTypeTree "/Applications/Safari.app"
Die Ausgabe für mich
kMDItemContentTypeTree = (
"com.apple.application-bundle",
"com.apple.application",
"public.executable",
"com.apple.localizable-name-bundle",
"com.apple.bundle",
"public.directory",
"public.item",
"com.apple.package"
)
Wenn Sie com.apple.package
dort zu sehen, wird angenommen, als ein Paket von Finder angezeigt werden. Natürlich alles mit „Bündel“ im Namen bedeutet, dass bereits, aber nicht alle Pakete Pakete sind (Bundles eine bestimmte Untergruppe von Paketen, die eine gut definierte Verzeichnisstruktur).
Alte Antwort:
Sie können eine Liste aller registrierten Dateierweiterungen erhalten, mit diesem Befehl (OS X vor Leopard):
/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump
oder für Leopard und später:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
Jede Dateierweiterung dort hat Flags. Wenn der Paket-Flag gesetzt ist, das ist ein Paket.
z.
claim id: 806354944
name: Bundle
role: none
flags: apple-internal relative-icon-path package
icon: Contents/Resources/KEXT.icns
bindings: .bundle
--------------------------------------------------------
claim id: 1276116992
name: Plug-in
role: none
flags: apple-internal relative-icon-path package
icon: Contents/Resources/KEXT.icns
bindings: .plugin
Vergleichen Sie dies mit einer Datei, die kein Bündel
claim id: 2484731904
name: TEXT
role: viewer
flags: apple-internal
icon:
bindings: .txt, .text, 'TEXT'
Der einzige Weg, um wirklich alle Bundles zu erhalten ist, indem in der LaunchService Datenbank (die, die wir oben dumped) nach oben. Wenn Sie nur durch gehen, ob es eine plist hat oder nicht oder ob das Bündel-Bit gesetzt ist oder nicht, können Sie einige oder sogar viele Bündel fangen, aber man kann nicht alle von ihnen fangen. Dies ist die Datenbank Finder verwendet, um zu bestimmen
- Ist das Verzeichnis ein Bündel oder nicht?
- Ist das eine bekannte Dateierweiterung oder nicht?
- Welche Anwendungen sollten unter „Öffnen mit“ für diesen Dateityp aufgelistet werden?
- Welches Symbol soll ich für die Anzeige von diesem Dateityp verwenden?
und einige weitere Sachen.
[EDIT: Hinzugefügt Pfad für Leopard, dank Hagelin für das Update]
Andere Tipps
Das ist ein bisschen spät, aber: es scheint, dass Sie Pakete mit dem Befehl mdls erkennen können. Insbesondere wird die (mehrzeiligen) Ausgabe:
mdls -name kMDItemContentTypeTree /Path/To/Directory
Wird die Zeichenfolge
"com.apple.package"
(einschließlich der Anführungszeichen, zumindest von Lion) irgendwo, wenn das Verzeichnis ein Paket ist. Wenn das Paket auch ein Bündel ist, wird der Ausgang auch enthält
"com.apple.bundle"
und, last but not least, wenn es speziell ein Anwendungspaket ist, wird der Ausgang auch enthalten
"com.apple.application-bundle"
(Das ist nach einigen sehr begrenzten Tests, sondern von dem, was Apple-Dokumentation auf Uniform Type Identifiers und die Manpage für mdls, sollte dies zutreffen. Und für die Dinge, die ich getestet, dies galt auch für Nicht-Apple bereitgestellten und bündelt, das ist, was Sie den Zweck der HWI gegeben erwarten würde.)
Während Sie einige Pakete auf der Grundlage der Existenz von‘./contents/Info.plist identifizieren können“, ist es nicht für alle Bündeltypen erforderlich (zB Dokumente und Legacy-Bundles). Finder identifiziert auch ein Verzeichnis als ein Bündel basierend auf Dateierweiterung (.app, .bundle, usw.) oder wenn das Bündel-Bit gesetzt ist.
das Bündel Bit von der Kommandozeile, um zu überprüfen:
getFileInfo -aB directory_name
Um alle Fälle fangen würde ich überprüfen:
- Ist der Bündel-Bit gesetzt?
- Wenn nicht, ist es eine Dateierweiterung haben, die sie als ein Bündel identifiziert? (Siehe
<plug>
starten Tool verfügt über eine Funktion für diese. Zum Beispiel:
% launch -f Guards.oo3 Guards.oo3: non-application package type: '' creator: '' kind: OmniOutliner 3 content type ID: com.omnigroup.omnioutliner.oo3-package contents: 1 item created: 3/6/09 3:36:50 PM modified: 3/6/09 4:06:13 PM accessed: 4/12/09 1:10:36 PM [only updated by Mac OS X] backed up: 12/31/03 6:00:00 PM % launch -f /Applications/Safari.app /Applications/Safari.app: scriptable Mac OS X application package type: 'APPL' creator: 'sfri' architecture: PowerPC 7400, Intel 80x86 bundle ID: com.apple.Safari version: 4 Public Beta kind: Application content type ID: com.apple.application-bundle contents: 1 item created: 8/21/07 5:11:33 PM modified: 2/24/09 7:29:51 PM accessed: 4/12/09 1:10:51 PM [only updated by Mac OS X] backed up: 12/31/03 6:00:00 PM
Sie sollten fähig sein, zu bekommen, was Sie durch Prüfen, ob die erste Zeile der Ausgabe in ‚Paket‘ endet sehen wollen.
launch
ist in Fink und MacPorts zu.</plug>
Es sollte eine Möglichkeit sein, um es von der Kommandozeile einfach zu tun, denn als Apple Benutzer, ich habe es Systemereignisse mit tun können. Also, wenn alles andere fehlschlägt, können Sie die notwendigen Apple von der Kommandozeile ausführen wie folgt:
$ FILE=/Users/myuser/Desktop/foo.rtfd
$ osascript -e "tell application \"System Events\" to get package folder of alias POSIX file \"${FILE}\""
Ergebnis
true
Ein Bündel sollte immer eine Datei `./contents/Info.plist‘. Sie können in einem Verzeichnis für die Existenz dies überprüfen, wenn ja, dann ist es ein Paket / bundle.