¿Cambiar la aplicación predeterminada (para una extensión de archivo) a través de un script/línea de comando?

¿Hay alguna manera de definir la aplicación predeterminada para una extensión de archivo a través de un script de Apple, un comando de línea de comandos (como defaults write [...]).

Sé que puede cambiarlo manualmente a través del panel de información o usando RCDefaultApp , pero como tengo que configurar muchas máquinas y cuentas de usuario, me gustaría encontrar una manera de automatizar el proceso.

Respuestas (3)

duti es una utilidad de shell que permite usar un archivo de texto para configurar las aplicaciones predeterminadas para tipos de archivos y esquemas de URL.

Por ejemplo, guarde un archivo como este como ~/.duti:

com.gnu.Emacs public.plain-text all 
com.gnu.Emacs public.unix-executable all
org.videolan.vlc .mkv all

Entonces corre duti ~/.duti.

Puede instalar duti con brew install dutio ejecutando wget https://github.com/fitterhappier/duti/archive/duti-1.5.2.tar.gz;tar -xf duti-1.5.2.tar.gz;cd duti-duti-1.5.2;./configure;make;sudo make install.

Esto parece prometedor, aunque parece que no puedo compilarlo en OS X 10.7.xo 10.8.x: checking which SDK to use... configure: error: darwin12.0.0 is not a supported system.
El binario en el instalador de pkg todavía funciona para mí en 10.8.
Ya veo. Para referencia futura, aquí está el enlace a esa descarga: downloads.sourceforge.net/project/duti/duti/duti-1.5.0/…
¿Funciona esto en 10.8? Configuré la aplicación predeterminada para abrir .aviarchivos en Quicktime Player (usando Finder → Obtener informaciónAbrir con… → _Cambiar todo ), luego corrí duti -s org.videolan.vlc public.avi allpara usar VLC en su lugar, luego reinicié LaunchServices , pero parecía no tener ningún efecto. (Consulte la lista de UTI declaradas por el sistema ).
Funciona para mí al menos. No debería requerir reconstruir la base de datos de Launch Services o reiniciar ni nada. Si echa un vistazo a ~/Library/Preferences/com.apple.LaunchServices.plist, duti convierte la mayoría de las extensiones de nombre de archivo en UTI automáticamente, por lo que generalmente puede especificar los tipos como .avien lugar de public.avi. Las UTI de algunas extensiones de nombre de archivo dependen de las aplicaciones que estén instaladas.
@LauriRanta Acabo de instalar duti en OS X 10.9 a través de homebrew, pero cuando creé el archivo .duti y lo ejecuté duti ~/.duti, obtuve role "all " unrecognized. Solo para su información, tuve que comentar las dos primeras líneas de su código de muestra y funcionó para VLC.
@macmadness Tiene que haber un salto de línea al final de la última línea.

Launch Services es responsable de las asociaciones de archivos predeterminadas.

Digamos que quisiera cambiar todos los archivos de texto para abrirlos en Sublime Text 2.

Primero necesito el kMDItemCFBundleIdentifier para Sublime Text 2. Puedo usar mdls para obtener esta información:

> mdls /Applications/Sublime\ Text\ 2.app 
_kTimeMachineIsCreationMarker  = 1
_kTimeMachineNewestSnapshot    = 4001-01-01 00:00:00 +0000
_kTimeMachineOldestSnapshot    = 2012-02-22 03:49:19 +0000
kMDItemCFBundleIdentifier      = "com.sublimetext.2"
....snip....

Puedo averiguar el valor del tipo de contenido para los archivos de texto al inspeccionar uno de ellos con mdls :

> mdls test.txt 
kMDItemContentCreationDate     = 2012-03-25 04:18:50 +0000
kMDItemContentModificationDate = 2012-03-25 04:18:50 +0000
kMDItemContentType             = "public.plain-text"
kMDItemContentTypeTree         = (
    "public.plain-text",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
kMDItemDateAdded               = 2012-03-25 04:18:50 +0000
kMDItemDisplayName             = "test.txt"
kMDItemFSContentChangeDate     = 2012-03-25 04:18:50 +0000
kMDItemFSCreationDate          = 2012-03-25 04:18:50 +0000
kMDItemFSCreatorCode           = ""
kMDItemFSFinderFlags           = 0
kMDItemFSHasCustomIcon         = 0
kMDItemFSInvisible             = 0
kMDItemFSIsExtensionHidden     = 0
kMDItemFSIsStationery          = 0
kMDItemFSLabel                 = 0
kMDItemFSName                  = "test.txt"
kMDItemFSNodeCount             = 975
kMDItemFSOwnerGroupID          = 20
kMDItemFSOwnerUserID           = 501
kMDItemFSSize                  = 975
kMDItemFSTypeCode              = ""
kMDItemKind                    = "Plain Text"
kMDItemLogicalSize             = 975
kMDItemPhysicalSize            = 4096

En este caso, cambiaré la aplicación predeterminada para todos los public.plain-texttipos.

Para hacer esto escribo:

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = \"public.plain-text\"; LSHandlerRoleAll = \"com.sublimetext.2\"; }'

Si quiero que los cambios surtan efecto, tendré que reiniciar los Servicios de lanzamiento de la siguiente manera:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user

Y para dar crédito donde se debe, aprendí sobre este enfoque de esta pregunta y respuesta de stackoverflow.com: https://stackoverflow.com/questions/9172226/how-to-set-default-application-for-specific-file -tipos-en-mac-os-x

Esta publicación en SuperUser también contiene información útil. Para obtener más información sobre LaunchServices, aquí hay un enlace a la documentación para desarrolladores de Apple. Vaya a la sección titulada LSSetDefaultRoleHandlerForContentType (página 48).