Determinar se um diretório é um pacote ou pacote no terminal do Mac OS X?

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

  •  02-07-2019
  •  | 
  •  

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.

Foi útil?

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>

ferramenta

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top