Mac OSX cambia la asociación de archivos por archivo en la línea de comandos

Necesito cambiar por lotes la aplicación asociada con ciertos archivos vía la línea de comando. No voy a cambiar la asociación de archivos para una determinada extensión de archivo, en realidad estoy buscando para orientar los archivos específicos para abrir en una aplicación diferente de la asociación predeterminada para ese tipo de archivo. No quiero cambiar la aplicación predeterminada para esta extensión de archivo en general, sólo para los archivos específicos que destino.

En este momento, estoy seleccionando todos los archivos que quiero cambiar en finder, pulsando option + command + i para abrir get info para varios archivos, y el cambio de la aplicación para esos archivos. Es un poco molesto.

Esta información se almacena en la bifurcación de recursos del archivo ( Wikipedia ). Estos tenedores de recursos están expuestos como atributos ampliados ( Wikipedia ):

$ ls -l@ somefile.txt -rw-r--r-- 1 danielbeck staff 0 18 Mär 19:00 somefile.txt # setting non-default application using Finder $ ls -l@ somefile.txt -rw-r--r--@ 1 danielbeck staff 0 18 Mär 19:01 somefile.txt com.apple.ResourceFork 1338 

Editar desde cero es probablemente muy doloroso – un montón de datos binarios:

 $ xattr -p com.apple.ResourceFork somefile.txt 00 00 01 00 00 00 05 08 00 00 04 08 00 00 00 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 00 00 00 32 2F 55 73 65 72 73 2F 64 61 6E 69 65 6C 62 65 63 6B 2F 41 70 70 6C 69 63 61 74 69 6F 6E 73 2F 53 75 62 6C 69 6D 65 20 54 65 78 74 20 32 2E 61 70 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 05 08 00 00 04 08 00 00 00 32 0C 00 00 00 C0 05 00 00 00 1C 00 32 00 00 75 73 72 6F 00 00 00 0A 00 00 FF FF 00 00 00 00 19 00 00 00 

Pero puedes tratar estos forks de recursos como archivos. Por ejemplo:

 $ open somefile.txt # opens in Sublime 2 $ cp somefile.txt/..namedfork/rsrc openInSublime2rsrc $ open otherfile.txt # opens in TextEdit $ cp openInSublime2rsrc otherfile.txt/..namedfork/rsrc $ open otherfile.txt # opens in Sublime 2 

/..namedfork/rsrc es cómo el fork de recursos se expone a las aplicaciones POSIX (es decir, probablemente todo lo que haces en Terminal).

Así que solo necesitas crear un archivo de "plantilla" de un fork de recursos existente (en este ejemplo openInSublime2rsrc ), y puedes copiarlo a tus otros archivos después.

Recogiendo de la respuesta de Daniel Beck arriba, esta información es realmente almacenada en la bifurcación de recursos del archivo. Apple proporciona dos utilidades, llamadas "Rez" y "DeRez" con las herramientas de desarrollo, que le permiten manipular horquillas de recursos. En particular, puede insertar un fork de recursos en un archivo con Rez.

Para cambiar la asociación de un único archivo desde la línea de comandos, primero cree un archivo del tipo correcto y cambie manualmente su asociación a la aplicación en la que desea que se abra. Esto crea la bifurcación de recursos en el archivo, T hacer esto, no habrá información para copiar. A continuación, extraiga la bifurcación de recursos con DeRez, como esto (asumiendo un archivo foo.txt, y que la aplicación que desea utilizar es Firefox.app).

 DeRez foo.txt > foo.r 

Esto creará un archivo llamado foo.r que es la bifurcación de recursos descompilados como un archivo de texto. Se verá algo como esto:

 data 'usro' (0) { $"0000 001A 2F41 7070 6C69 6361 7469 6F6E" /* ..../Application */ $"732F 4669 7265 666F 782E 6170 7000 0000" /* s/Firefox.app... */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ 

Puedes editar esto si quieres crear uno desde cero, pero tienes que obtener el formato exactamente correcto o no funcionará. Solo se trata de caracteres hexadecimales que describen la ruta al paquete de aplicaciones que desea, terminado con un cero.

Es posible que vea un mensaje diciendo que la bifurcación de recursos está vacía y no se ha iniciado. Si es así, no ha cambiado la asociación por archivo en el archivo de origen, por lo que necesita hacerlo y vuelva a ejecutar el comando DeRez.

Una vez que tenga esto, puede empujar esto en otro archivo de la siguiente manera (suponiendo que bar.txt existe):

 Rez foo.r -a -o bar.txt 

Esto actualiza bar.txt en su lugar con la bifurcación de recursos de foo.r.

Para comprobarlo funcionó bien, ya que ni Rez ni DeRez imprimir mensajes de error, sólo tiene que hacer esto:

 DeRez bar.txt 

Debería ver la misma información que antes. Después de todo eso, simplemente abra el archivo bar.txt como lo haría normalmente, y debería abrirlo en la aplicación correcta, no en el predeterminado.

Para realizar un cambio por lotes, una vez que tenga el archivo .r, puede utilizar una expansión comodín estándar como ésta:

 Rez foo.r -a -o *.txt 

Eso hará que todos los archivos que coincidan con el comodín.

He hecho esto en 10.7, pero es mi entendimiento que esto funciona en máquinas anteriores también.

Usted dice que quiere "cambiar por lotes" la aplicación asociada a un dado (sub) conjunto de archivos, de un tipo dado. Porque no desea cambiar todas las instancias de ese tipo de archivo a esa nueva aplicación.

Sin embargo, no hay una manera fácil de hacer esto. La forma en que LaunchServices averigua qué aplicación se debe decir para abrir un archivo es un proceso de varios niveles y depende de la configuración con diferentes ámbitos (usuario, sistema, etc.).

Pero – puede utilizar open en la línea de comandos y decirle que utilice una aplicación específica esta vez. Esto no cambiaría ninguna asociación, pero lograría lo que usted dice que quiere, a saber, abrir un conjunto de archivos en una aplicación específica:

open -a <appbundle> <somefile> <anotherfile>

me gusta

 shiny:t fl$ ls -l total 1848 -rwxr-xr-x 1 fl staff 1795 Mar 18 20:03 distribution.pl -rw-r--r-- 1 fl staff 939264 Mar 18 20:03 objectreport.txt shiny:t fl$ open -a TextWrangler distribution.pl objectreport.txt 

Y, saliendo totalmente de la línea de comando: eche un vistazo a esta utilidad: http://michelf.com/software/magic-launch/