Mac OSX altera a associação de arquivos por arquivo na linha de comando

8

Eu preciso mudar em lote o aplicativo associado a certos arquivos através da linha de comando. Eu não estou a mudar a associação de arquivos para uma determinada extensão de arquivo, estou realmente olhando para direcionar arquivos específicos para abrir em um aplicativo diferente do que a associação padrão para esse tipo de arquivo. Eu não quero alterar o aplicativo padrão para essa extensão de arquivo geral, apenas para os arquivos específicos que eu segmentar.

Agora, estou selecionando todos os arquivos que eu quero alterar no localizador, pressionando a opção + comando + i para abrir a obtenção de informações para vários arquivos e a alteração do aplicativo para esses arquivos. É meio chato.

    
por Rob 18.03.2011 / 17:21

4 respostas

5

Esta informação é armazenada na bifurcação do recurso do arquivo ( Wikipedia ). Esses forks de recursos são expostos como atributos estendidos ( 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 

A edição a partir do zero é provavelmente bastante dolorosa - muitos dados binários:

$ 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

Mas você pode tratar esses garfos de recursos como arquivos. Por exemplo:

$ 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 é como o fork de recursos é exposto a aplicativos POSIX (isto é, provavelmente tudo que você faz no Terminal).

Portanto, você só precisa criar um arquivo "modelo" a partir de uma bifurcação de recursos existente (neste exemplo, openInSublime2rsrc ), e depois copiá-lo para seus outros arquivos.

    
por 18.03.2011 / 19:07
3

Pegando a resposta de Daniel Beck acima, esta informação é de fato armazenada na bifurcação de recurso do arquivo. A Apple fornece dois utilitários, chamados "Rez" e "DeRez", com as ferramentas do desenvolvedor, que permitem manipular garfos de recursos. Em particular, você pode enviar um fork de recursos para um arquivo com Rez.

Para alterar a associação de um único arquivo da linha de comando, primeiro crie um arquivo do tipo correto e altere manualmente sua associação para o aplicativo no qual deseja abrir. Isso cria a bifurcação de recurso no arquivo - se você não faz isso, não haverá informações para copiar. Em seguida, retire o fork de recursos com o DeRez, como este (assumindo um arquivo foo.txt, e que o aplicativo que você deseja usar é o Firefox.app).

DeRez foo.txt > foo.r

Isso criará um arquivo chamado foo.r, que é a bifurcação de recurso decompilado como um arquivo de texto. Será algo parecido com isto:

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"            /* ................ */

Você pode editá-lo se quiser criar um do zero, mas precisa ter o formato exatamente correto ou não funcionará. São apenas caracteres codificados em hexadecimal que descrevem o caminho para o pacote de aplicativos desejado, finalizado com um zero.

Você pode ver uma mensagem dizendo que o fork do recurso está vazio e não inicializado. Em caso afirmativo, você não alterou a associação por arquivo no arquivo de origem, portanto, é necessário fazer isso e, em seguida, executar novamente o comando DeRez.

Depois de ter isso, você pode enviar isso para outro arquivo da seguinte maneira (supondo que exista bar.txt):

Rez foo.r -a -o bar.txt

Isso atualiza bar.txt no lugar com a bifurcação de recursos de foo.r.

Para verificar, funcionou bem, já que nem Rez nem DeRez imprimem mensagens de erro, apenas faça isso:

DeRez bar.txt

Você deve ver as mesmas informações de antes. Depois de tudo isso, basta abrir o arquivo bar.txt como faria normalmente, e ele deve abrir no aplicativo correto, não no padrão.

Para fazer uma alteração em lote, depois de ter o arquivo .r, você pode usar uma expansão curinga padrão como esta:

Rez foo.r -a -o *.txt

Isso fará todos os arquivos que corresponderem ao curinga.

Eu fiz isso no 10.7, mas eu entendo que isso funciona em máquinas anteriores também.

    
por 08.10.2011 / 10:35
1

Eu fiz isso usando xattr ( funciona perfeitamente no volume do APFS)

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

Veja este tópico se precisar de mais

    
por 27.09.2017 / 23:26
0

Você diz que deseja "alterar em lote" o aplicativo associado a um determinado (sub) conjunto de arquivos, de um determinado tipo. sub-conjunto porque você não quer mudar todas as instâncias daquele tipo de arquivo para aquele novo aplicativo.

No entanto, não há uma maneira fácil de fazer isso. A forma como o LaunchServices descobre qual aplicativo deve ser informado para abrir um arquivo é um processo de vários estágios e depende de configurações com diferentes escopos (usuário, sistema e assim por diante).

Mas - você pode usar open na linha de comando e dizer para usar um aplicativo específico neste momento. Isso não alteraria nenhuma associação, mas atingiria o que você diz que deseja, ou seja, abrir um conjunto de arquivos em um aplicativo específico:

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

como

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

e, indo totalmente longe da linha de comando: dê uma olhada neste utilitário: link

    
por 18.03.2011 / 19:30