Déterminer si un répertoire est un ensemble ou un package dans le terminal Mac OS X?

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

  •  02-07-2019
  •  | 
  •  

Question

J'aimerais pouvoir déterminer si un répertoire tel que ".app" est considéré comme un paquet ou un ensemble du point de vue de Finder sur la ligne de commande. Je ne pense pas que ce serait difficile à faire avec un petit programme shell, mais je préférerais ne pas réinventer la roue si je n’étais pas obligé.

Était-ce utile?

La solution

Mise à jour:

Sur tous les systèmes dotés de Spotlight, mdls vous permet de détecter les ensembles qui consultent la propriété kMDItemContentTypeTree. Exemple:

mdls -name kMDItemContentTypeTree "/Applications/Safari.app"

produit la sortie suivante pour moi

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"
)

Chaque fois que vous voyez com.apple.package, il est supposé être affiché sous forme de package par le Finder. Bien sûr, tout ce qui contient & "; Bundle &"; dans le nom implique que déjà tous les packages sont des bundles (les bundles sont un sous-ensemble spécifique de packages ayant une structure de répertoire bien définie).

Ancienne réponse:

Vous pouvez obtenir une liste de toutes les extensions de type de fichier enregistrées à l'aide de cette commande (OS X antérieure à Leopard):

/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump

ou pour Leopard et les versions ultérieures:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump

Chaque extension de fichier présente des drapeaux. Si l'indicateur de package est défini, il s'agit d'un package.

ex.

  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

Comparez cela à un fichier non groupé

    claim   id:            2484731904
            name:          TEXT
            role:          viewer
            flags:         apple-internal  
            icon:          
            bindings:      .txt, .text, 'TEXT'

La seule façon d'obtenir vraiment tous les ensembles consiste à rechercher dans la base de données LaunchService (celle que nous avons vue plus haut). Si vous vous contentez de choisir s'il a un plist ou non, ou si le bit de paquet est activé ou non, vous pourriez attraper certains ou même plusieurs paquets, mais vous ne pouvez pas tous les attraper. Ceci est la base de données utilisée par le Finder pour déterminer

  • Ce répertoire est-il un ensemble ou non?
  • S'agit-il d'une extension de fichier connue ou non?
  • Quelles applications doivent être répertoriées sous & "Ouvrir avec &"; pour ce type de fichier?
  • Quelle icône dois-je utiliser pour afficher ce type de fichier?

et quelques autres choses.

[EDIT: ajout du chemin pour Leopard, merci à Hagelin pour la mise à jour]

Autres conseils

C’est un peu tard, mais il semble que vous puissiez détecter des ensembles à l’aide de la commande mdls. Plus précisément, la sortie (multiligne) de:

mdls -name kMDItemContentTypeTree /Path/To/Directory

Contiendra la chaîne

"com.apple.package"

(y compris les guillemets, au moins à partir de Lion) quelque part si le répertoire est un package. Si le package est également un ensemble, la sortie contiendra également

"com.apple.bundle"

et enfin, s'il s'agit spécifiquement d'un ensemble d'applications, la sortie contiendra également

"com.apple.application-bundle"

(Selon des tests très limités, mais d'après la documentation d'Apple sur les identificateurs de type uniforme et la page de manuel relative à mdls, cela devrait être vrai. Et pour les éléments que j'ai testés, cela s'appliquait aux utilisateurs non fournis par Apple forfaits également, ce qui est ce à quoi vous vous attendriez étant donné le but des UTI.)

Bien que vous puissiez identifier certains ensembles en fonction de l'existence de './contents/Info.plist" ;, ce n'est pas obligatoire pour tous les types d'ensembles (par exemple, les documents et les ensembles hérités). Le Finder identifie également un répertoire comme un ensemble basé sur l’extension de fichier (.app, .bundle, etc.) ou si le bit d’ensemble est défini.

Pour vérifier le bit de paquet à partir de la ligne de commande, utilisez:

getFileInfo -aB directory_name

Afin de détecter tous les cas, je voudrais vérifier:

  • Le bit de paquet est-il défini?
  • Si non, existe-t-il une extension de fichier qui l'identifie comme un ensemble? (voir La réponse de Mecki )
  • Sinon, ce n'est probablement pas un paquet.

<plug>

Mon outil launch dispose d'une fonctionnalité à cet effet. Par exemple:

% 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

Vous devriez pouvoir obtenir ce que vous voulez en vérifiant que la première ligne de sortie se termine par 'package'.

launch est également dans Fink et MacPorts.

</plug>

Il devrait y avoir un moyen de le faire facilement à partir de la ligne de commande, car en tant qu’utilisateur AppleScript, je peux le faire avec les événements système. Si tout échoue, vous pouvez exécuter le script AppleScript nécessaire à partir de la ligne de commande, comme suit:

$ FILE=/Users/myuser/Desktop/foo.rtfd
$ osascript -e "tell application \"System Events\" to get package folder of alias POSIX file \"${FILE}\""

résultat est

true

Un paquet devrait toujours avoir un fichier `./contents/Info.plist '. Vous pouvez en vérifier l’existence dans un répertoire. Si c’est le cas, il s’agit d’un paquet / bundle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top