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

11

¿Hay alguna manera de definir la aplicación predeterminada para una extensión de archivo a través de un script de Apple, comando de línea de comando (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.

oschrenk
fuente

Respuestas:

6

duti es una utilidad de shell que permite usar un archivo de texto para configurar las aplicaciones predeterminadas para los 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.

Lri
fuente
Esto parece prometedor, aunque me parece que no puede compilar en OS X 10.7.x o 10.8.x: checking which SDK to use... configure: error: darwin12.0.0 is not a supported system.
Mathias Bynens
El binario en el instalador de pkg todavía funciona para mí en 10.8.
Lri
Veo. Para referencia futura, aquí está el enlace a esa descarga: downloads.sourceforge.net/project/duti/duti/duti-1.5.0/…
Mathias Bynens
¿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, luego reinicié LaunchServices , pero parecía no tener ningún efecto. (Consulte la lista de infecciones
urinarias
1
Funciona para mí al menos. No debería requerir reconstruir la base de datos de Launch Services o reiniciar ni nada. Si observa ~/Library/Preferences/com.apple.LaunchServices.plist, duti convierte la mayoría de las extensiones de nombre de archivo a UTI automáticamente, por lo que generalmente puede especificar los tipos como en .avilugar de public.avi. Las UTI de algunas extensiones de nombre de archivo dependen de las aplicaciones que están instaladas.
Lri
12

Launch Services es responsable de las asociaciones de archivos predeterminadas.

Digamos que quería cambiar todos los archivos de texto para abrir 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 inspeccionando 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 Launch Services de esta 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: /programming/9172226/how-to-set-default-application-for-specific-file -tipos-en-mac-os-x

Ian C.
fuente
0

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 del desarrollador de Apple. Vaya a la sección titulada LSSetDefaultRoleHandlerForContentType (página 48).

John Rygielski
fuente