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

10

Necesito cambiar por lotes la aplicación asociada con ciertos archivos a través de 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 apuntar a archivos específicos para abrir en una aplicación diferente a la asociación predeterminada para ese tipo de archivo. No quiero cambiar la aplicación predeterminada para esta extensión de archivo en general, solo para los archivos específicos a los que me dirijo.

En este momento, estoy seleccionando todos los archivos que quiero cambiar en el buscador, presionando la opción + comando + i para abrir obtener información para múltiples archivos, y cambiando la aplicación para esos archivos. Es un poco molesto.

Robar
fuente

Respuestas:

6

Esta información se almacena en la bifurcación de recursos del archivo ( Wikipedia ). Estas bifurcaciones de recursos se exponen como atributos extendidos ( 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 bastante doloroso: muchos 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 puede tratar estos tenedores 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 la bifurcación de recursos se expone a las aplicaciones POSIX (es decir, probablemente todo lo que haces en la Terminal).

Por lo tanto, solo necesita crear un archivo de "plantilla" a partir de una bifurcación de recursos existente (en este ejemplo openInSublime2rsrc), y luego puede copiarlo en sus otros archivos.

Daniel Beck
fuente
1
Esta solución funcionó hasta Lion. Copiar al archivo / rsrc me da un error ": No es un directorio". Volver al punto de partida :(
Rob
1
@Rob Intenta usar en su somefile.txt/..namedfork/rsrclugar. somefile.txt/rsrcha quedado en desuso hace un tiempo.
Daniel Beck
Daniel Beck, eres un salvavidas, muchas gracias.
Rob
No necesita editar los tenedores de recursos directamente; vea mi respuesta a continuación, pero el resumen es que puede usar utilidades llamadas Rez y DeRez para editar tenedores de recursos. Dado que estas son herramientas de desarrollador compatibles, es menos probable que tenga un problema.
mauvedeity
5

Partiendo de la respuesta anterior de Daniel Beck, esta información se almacena 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 los tenedores de recursos. En particular, puede insertar una bifurcación de recursos en un archivo con Rez.

Para cambiar la asociación de un solo 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, si no lo hace ' No haga esto, no habrá información para copiar. Luego, extraiga la bifurcación de recursos con DeRez, de esta manera (suponiendo un archivo foo.txt, y que la aplicación que desea usar 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"            /* ................ */

Puede editar esto si desea crear uno desde cero, pero debe obtener el formato exactamente correcto o no funcionará. Son solo caracteres codificados en hexadecimal que describen la ruta al paquete de aplicaciones que desea, terminados en cero.

Es posible que vea un mensaje que dice que la bifurcación de recursos está vacía y sin inicializar. Si es así, no ha cambiado la asociación por archivo en el archivo fuente, por lo que debe hacer eso y luego volver a ejecutar el comando DeRez.

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

Rez foo.r -a -o bar.txt

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

Para verificar que funcionó bien, ya que ni Rez ni DeRez imprimen mensajes de error, simplemente haga 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 abrirse en la aplicación correcta, no en la predeterminada.

Para hacer un cambio por lotes, una vez que tenga el archivo .r, puede usar una expansión comodín estándar como esta:

Rez foo.r -a -o *.txt

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

He hecho esto en 10.7, pero tengo entendido que esto también funciona en máquinas anteriores.

malvadedad
fuente
Información interesante sobre estas herramientas. Aún así, parece que estas herramientas no hacen nada que el acceso ..namedfork/rsrcno haga, ¿correcto? Usted intercambia conocimientos que requieren conocimientos (semi) internos por conocimientos sobre herramientas específicas; no estoy convencido de que esto sea mejor.
Daniel Beck
@DanielBeck Tienes razón, que yo sepa. Sin embargo, como se dijo anteriormente, la información interna cambió con Lion, mientras que estas son herramientas de desarrollo estables que deberían ser independientes de la versión. Personalmente, creo que las cosas internas son interesantes, pero es más probable que las herramientas funcionen multiplataforma, y ​​prefiero usar las herramientas compatibles.
mauvedeity
3

Lo hice usando xattr (funciona perfectamente en el volumen APFS)

xattr -wx com.apple.LaunchServices.OpenWith \
"`xattr -px com.apple.LaunchServices.OpenWith FILEWITHGOODTYPE`" FILETOCHANGE

Vea este tema si necesita más

Papá Noel
fuente
1

Dice que desea "cambiar por lotes" la aplicación asociada con un determinado (sub) conjunto de archivos, de un tipo determinado. subconjunto 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 descubre qué aplicación se debe indicar que abra un archivo es un proceso de varias etapas y depende de la configuración con diferentes ámbitos (usuario, sistema, etc.).

Pero, podría usar openen la línea de comandos y decirle que use una aplicación específica esta vez. Esto no cambiaría ninguna asociación, pero lograría lo que usted dice que quiere, es decir, 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, alejándose totalmente de la línea de comandos: eche un vistazo a esta utilidad: http://michelf.com/software/magic-launch/

Florenz Kley
fuente
En su ejemplo específico, open -a TextWrangler *sería aún más rápido.
Daniel Beck
sí, pero eso agregaría la capa de expansión de comodines de shell a la explicación, lo que haría que el ejemplo fuera menos comprensible :-) no es tan malo para abrir, pero hay otras herramientas que solo invitan a problemas con comodines ...
Florenz Kley