Determinar se um diretório é um pacote ou pacote no terminal do Mac OS X?
Pergunta
Eu gostaria de ser capaz de determinar se um diretório como um '.app' é considerado como um pacote ou pacote do ponto de vista na linha de comando do Finder. Eu não acho que isso seria difícil de fazer com um pequeno programa de shell, mas eu prefiro não re-inventar a roda, se eu não preciso.
Solução
Update:
Em todos os sistemas com Spotlight, usando mdls
você pode detectar pacotes olhando para a propriedade kMDItemContentTypeTree. Por exemplo:.
mdls -name kMDItemContentTypeTree "/Applications/Safari.app"
produz o seguinte resultado para mim
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"
)
Sempre que você vê com.apple.package
lá, que é suposto ser exibido como um pacote por Finder. Claro, tudo com o "pacote" em nome implica que já, mas nem todos os pacotes são pacotes (bundles são um subconjunto específico de pacotes que possuem uma estrutura de diretório bem definido).
Resposta antiga:
Você pode obter uma lista de todas as extensões de tipo de arquivo registrados, usando este comando (OS X antes Leopard):
/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump
ou para o Leopard e posterior:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
extensão de arquivo Cada lá tem bandeiras. Se o sinalizador pacote é definido, este é um pacote.
por exemplo.
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
Compare isso com um arquivo que não é pacote
claim id: 2484731904
name: TEXT
role: viewer
flags: apple-internal
icon:
bindings: .txt, .text, 'TEXT'
A única maneira de realmente obter todos os pacotes é olhando-se no banco de dados LaunchService (aquele que despejados acima). Se você acabou de ir por se tem um plist ou não, ou se o bit pacote é definido ou não, você pode pegar alguns ou mesmo muitos pacotes, mas você não pode pegar todos eles. Este é o banco de dados usa Localizador para determinar
- É este o diretório de um pacote ou não?
- Será esta uma extensão de arquivo conhecido ou não?
- Quais as aplicações devem ser listados em "Abrir com" para este tipo de arquivo?
- Qual ícone deve usar para exibir este tipo de arquivo?
e mais algumas coisas.
[EDIT: caminho Adicionado para o Leopard, graças a Hagelin para a atualização]
Outras dicas
Este é um pouco tarde, mas: parece que você pode detectar pacotes usando o comando MDLs. Especificamente, o (multi-linha) de saída:
mdls -name kMDItemContentTypeTree /Path/To/Directory
Será que contêm a cadeia
"com.apple.package"
(incluindo as aspas, pelo menos a partir de Lion) em algum lugar se o diretório é um pacote. Se o pacote é também um pacote, a saída também conterá
"com.apple.bundle"
e, por último mas não menos importante, se é especificamente um pacote de aplicativos, a saída também conterá
"com.apple.application-bundle"
(Isso de acordo com alguns testes muito limitada, mas pelo que a documentação da Apple sobre identificadores tipo uniforme, e a página man para MDLs, isso deve ser verdade. E para os itens I testados, isso era verdade para não-Apple forneceu feixes, bem como, que é o que você poderia esperar dado o propósito de UTIs).
Enquanto você pode identificar alguns pacotes com base na existência de' ./contents/Info.plist", não é necessário para todos os tipos de bundle (por exemplo, documentos e pacotes legados). Localizador também identifica um diretório como um pacote com base na extensão de arquivo (.app, .bundle, etc) ou se o bit pacote está definido.
Para verificar o bit pacote a partir do uso de linha de comando:
getFileInfo -aB directory_name
A fim de pegar todos os casos que eu iria verificar:
- É o conjunto bit pacote?
- Se não, ele tem uma extensão de arquivo que o identifica como um pacote? (Veja o Mecki resposta )
- Se não for, provavelmente não é um pacote.
<plug>
lançamento tem um recurso para isso. Por exemplo:
% 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
Você deve ser capaz de obter o que deseja, verificando para ver se a primeira linha de extremidades de saída no 'pacote'.
launch
está em Fink e MacPorts também.
</plug>
Deve haver uma maneira de fazê-lo facilmente a partir da linha de comando, porque como um usuário AppleScript, eu posso fazer isso usando eventos do sistema. Então, se tudo mais falhar, você pode executar o necessário AppleScript na linha de comando da seguinte forma:
$ FILE=/Users/myuser/Desktop/foo.rtfd
$ osascript -e "tell application \"System Events\" to get package folder of alias POSIX file \"${FILE}\""
resultado é
true
Um pacote deve sempre ter um arquivo `./contents/Info.plist'. Você pode verificar a existência deste em um diretório, se assim for, então é um pacote / pacote.