¿Existe un equivalente en macOS del comando assoc de Windows?

Estoy buscando cambiar una asociación de archivos en la Mac usando algún tipo de script. Sé que puedo hacer algo así en Windows usando el assoccomando.

¿Hay algo programable en macOS que haga un trabajo similar? No me importa si está en Bash (mi preferencia), AppleScript o algo en Automator.

Conozco el dutilcomando, pero quiero poder hacerlo sin software adicional.

Respuestas (2)

Cambiar la asociación de archivos para un solo archivo o un conjunto de archivos (AppleScript)

Esta secuencia de comandos demuestra primero que la aplicación predeterminada para algunos archivos de texto en mi sistema se configuró en TextEdit . Luego cambia la asociación de archivos para ese archivo en particular, por lo que ahora se abre con Atom . Finalmente, asocia todos los archivos de texto del escritorio con la aplicación Atom .

tell application "System Events"
    get the default application of the file "/path/to/some file.txt"
        --> alias "Macintosh HD:Applications:TextEdit.app:" of application "System Events"

    # Individual file:
    set the default application of the file "/path/to/some file.txt" to ¬
        the path to the application named "Atom"

    # A set of files:
    set the default application of every file of the desktop folder whose ¬
        name extension = "txt" to the path to the application "Atom"
end tell

Cambiar las asociaciones de archivos para todos los archivos de un tipo determinado (JXA)

Al usar JavaScript para automatización, puede implementar funciones de Core Foundation de una manera que no puede hacer con AppleScriptObjC, para interactuar con los servicios de lanzamiento en el nivel del sistema y cambiar la asociación de archivos para un tipo de archivo determinado.

Aquí, he apuntado a archivos de texto sin formato (estos tienen extensión .txtde forma predeterminada) y cambié la aplicación predeterminada que responde a ellos a Atom :

ObjC.import('CoreServices');

var contentType = 'public.plain-text';
var bundleID = Application('Atom').id();

$.LSSetDefaultRoleHandlerForContentType(
            contentType, 
            $.kLSRolesAll, 
            bundleID
        );

El tipo de archivo debe orientarse mediante un Identificador de tipo uniforme . Estas son cadenas de texto especiales que identifican de forma única una clase o tipo de elemento determinado. El enlace lo llevará a una página que enumera las UTI declaradas por el sistema de Apple para todos los tipos de archivos que probablemente le interesen. Tenga cuidado de no elegir simplemente el que parece satisfacer sus necesidades a primera vista, ya que las UTI son estructurado en una especie de árbol de herencia. Por lo tanto, podría haber seleccionado perezosamente public.text, que vi primero en la lista, hasta que en lecturas adicionales, aprendamos que esta UTI es un tipo base para todo el texto, que incluiría HTMLy RTFarchivos.

Clavó en la pregunta real que se hizo: ¿cómo cambio las cosas? Gran solución y enseña mucho también.
¿Hay alguna manera de enumerar todas las aplicaciones asociadas con un determinado archivo?
@VK Sí, puede usar el NSWorkspacemétodo de instancia de Objective-C URLsForApplicationsToOpenURL:, pasándole una NSURLreferencia de archivo similar para el archivo en cuestión. Devuelve una matriz de NSURLs, uno para cada una de las aplicaciones que están registradas para abrir el archivo.

No existe un equivalente directo de asoc . El mapeo de archivos de Apple se implementa de manera muy diferente a Windows. Los metadatos del archivo tienen muchas variables que afectan los servicios de lanzamiento y la asignación de un archivo en particular a una aplicación en particular puede involucrar varios factores.

El sistema macOS utiliza una base de datos de Servicios de lanzamiento para asignar tipos de archivos y, en segundo lugar, extensiones de archivos a las aplicaciones que los abren, lo más parecido sería assocuna lsregisterutilidad que expone la base de datos y la API a la línea de comandos.

Está enterrado dentro de la carpeta del sistema, Core Services, marco que contiene LaunchServices.

Hay toneladas de buenas preguntas y respuestas aquí una vez que conoce la utilidad que debe buscar, así como toneladas de excelentes publicaciones en blogs , guías para desarrolladores y documentación oficial .

Como tengo /usr/local/bin en mi ruta, generalmente lo enlazo allí para poder escribirlo:

mac:~ me$ ln -s /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister  /usr/local/bin
mac:~ me$ lsregister
lsregister: [OPTIONS] [ <path>... ]
                      [ -apps <domain>[,domain]... ]
                      [ -libs <domain>[,domain]... ]
                      [ -all  <domain>[,domain]... ]

Paths are searched for applications to register with the Launch Service database.
Valid domains are "system", "local", "network" and "user". Domains can also
be specified using only the first letter.

  -kill     Reset the Launch Services database before doing anything else
  -seed     If database isn't seeded, scan default locations for applications and libraries to register
  -lint     Print information about plist errors while registering bundles
  -lazy n   Sleep for n seconds before registering/scanning
  -r        Recursive directory scan, do not recurse into packages or invisible directories
  -R        Recursive directory scan, descending into packages and invisible directories
  -f        force-update registration even if mod date is unchanged
  -u        unregister instead of register
  -v        Display progress information
  -gc       Garbage collect old data and compact the database
  -dump     Display full database contents after registration
  -h        Display this help