Pregunta

Me gustaría ser capaz de determinar si un directorio como una '.app' es considerado como un paquete o paquete de Buscador de puntos de vista sobre la línea de comandos.No creo que esto sería difícil de hacer con un pequeño programa de shell, pero prefiero no volver a inventar la rueda, si no tengo para.

¿Fue útil?

Solución

Actualización:

En todos los sistemas con el centro de atención, el uso de mdls usted puede detectar haces mirando el kMDItemContentTypeTree de la propiedad.E. g.:

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

produce la siguiente salida para mí

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

Cada vez que usted vea com.apple.package allí, se supone que se muestra como un paquete por Buscador.Por supuesto, todo con el "paquete" en el nombre implica que, ya, pero no todos los paquetes son paquetes (bundles son un subconjunto específico de paquetes que tienen una bien definida estructura de directorios).


Respuesta Anterior:

Usted puede obtener una lista de todos los tipo de archivo registrado extensiones, el uso de este comando (OS X antes de Leopardo):

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

o de Leopardo y más tarde:

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

Cada extensión de archivo no tiene banderas.Si el paquete de bandera, este es un paquete.

E. g.

  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 esto con un archivo que no es ningún paquete

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

La única manera de conseguir realmente todos los paquetes está buscando en el LaunchService de la base de datos (el que dejamos arriba).Si usted acaba de ir por si tiene un plist o no, o si el paquete está establecido el bit o no, de que podría tomar algunos o, incluso, muchos paquetes, pero usted no puede coger todos ellos.Esta es la base de datos del Buscador utiliza para determinar

  • Es este directorio un paquete o no?
  • Es este un conocido extensión de archivo o no?
  • De las aplicaciones que debe estar en la lista bajo "Abrir Con" para este tipo de archivo?
  • El icono que se debe utilizar para la visualización de este tipo de archivo?

y algunas cosas más.

[EDITAR:Añadido camino de Leopardo, gracias a Hagelin para la actualización]

Otros consejos

Este es un poco tarde, pero:parece que usted puede detectar paquetes utilizando los millones de dólares de comandos.Específicamente, la (multi-línea) salida de:

mdls -name kMDItemContentTypeTree /Path/To/Directory

Contendrá la cadena

"com.apple.package"

(incluyendo las comillas, al menos como la de León) en algún lugar si el directorio es un paquete.Si el paquete es también un paquete, la salida también contienen

"com.apple.bundle"

y, por último pero no menos importante, si lo es, específicamente, un paquete de la aplicación, la salida también contienen

"com.apple.application-bundle"

(Que según algunas pruebas muy limitadas, pero de lo que la documentación de Apple en el Tipo de Uniforme Identificadores, y la página man de millones de dólares, esto debe ser cierto.Y por los artículos que he probado, esto era cierto para los no-Apple-siempre haces así, que es lo que cabría esperar dado el propósito de infecciones urinarias.)

Mientras que usted puede identificar algunos paquetes se basa en la existencia de './contents/Info.plist", no es necesario para todos los paquete de tipos (por ejemplo,los documentos y el legado de paquetes).Finder también identifica un directorio como un paquete basado en la extensión del archivo (.aplicación .bundle, etc) o si el paquete está establecido el bit.

Para comprobar el paquete de bits desde la línea de comandos de uso:

getFileInfo -aB directory_name

Con el fin de atrapar todos los casos me gustaría comprobar:

  • Es el paquete de conjunto de bits?
  • Si no, ¿tiene una extensión de archivo que identifica como un paquete?(ver Mecki la respuesta)
  • Si no, probablemente no sea un paquete.

<plug>

Mi lanzamiento la herramienta tiene una función para esto.Por ejemplo:

% 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

Usted debe ser capaz de conseguir lo que desea mediante la comprobación para ver si la primera línea de salida termina en 'paquete'.

launch es en Fink y MacPorts demasiado.

</plug>

Debe haber una manera de hacerlo fácilmente desde la línea de comandos, ya que como AppleScript usuario, puedo hacerlo con los Eventos del Sistema.Así que si todo lo demás falla, usted puede ejecutar la necesaria AppleScript desde la línea de comandos de la siguiente manera:

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

el resultado es

true

Un paquete siempre debe tener un archivo `./contents/Info.plist'.Usted puede comprobar la existencia de este en un directorio, si es así, entonces es un paquete/paquete.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top