Déterminer si un répertoire est un ensemble ou un package dans le terminal Mac OS X?
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é.
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.