Determinar si un directorio es un paquete en el Mac OS X terminal?
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.
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.