Bestimmen Sie, ob ein Verzeichnis ein Bündel oder Paket in dem Mac OS X-Terminal ist?

StackOverflow https://stackoverflow.com/questions/121147

  •  02-07-2019
  •  | 
  •  

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top