Associação de arquivos de alteração do Mac OSX por arquivo na linha de comando

10

Preciso alterar em lote o aplicativo associado a determinados arquivos por meio da linha de comando. Não devo alterar a associação de arquivos para uma determinada extensão, na verdade, estou procurando segmentar arquivos específicos para abrir em um aplicativo diferente da associação padrão para esse tipo de arquivo. Não quero alterar o aplicativo padrão para esta extensão de arquivo em geral, apenas para os arquivos específicos que eu segmentar.

No momento, estou selecionando todos os arquivos que desejo alterar no localizador, pressionando a opção + command + i para abrir as informações de vários arquivos e a alteração do aplicativo para esses arquivos. É meio chato.

Roubar
fonte

Respostas:

6

Esta informação é armazenada na bifurcação de recursos do arquivo ( Wikipedia ). Esses garfos 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 

Editar do zero é provavelmente bastante doloroso - 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 a bifurcação de recursos é exposta aos aplicativos POSIX (ou seja, provavelmente tudo o 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 poderá copiá-lo para seus outros arquivos posteriormente.

Daniel Beck
fonte
1
Essa solução funcionou até o Lion. Copiar para o arquivo / rsrc gera um erro ": Não é um diretório". De volta à estaca zero :(
Rob
1
@ Rob Tente usar em seu somefile.txt/..namedfork/rsrclugar. somefile.txt/rsrcfoi descontinuado há um tempo.
Daniel Beck
Daniel Beck - você é um salva-vidas, muito obrigado.
Rob
Você não precisa editar diretamente os garfos de recursos - veja minha resposta abaixo, mas o resumo é que você pode usar utilitários chamados Rez e DeRez para editar os garfos de recursos. Como essas são ferramentas de desenvolvedor suportadas, é menos provável que você tenha um problema.
Mauvedeity
5

Pegando na resposta de Daniel Beck acima, essas informações são realmente armazenadas na bifurcação de recursos 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 uma bifurcação de recursos para um arquivo com Rez.

Para alterar a associação de um único arquivo na linha de comando, primeiro crie um arquivo do tipo certo e altere manualmente sua associação para o aplicativo em que você deseja que ele seja aberto. Isso cria a bifurcação de recursos no arquivo - se você não Para isso, não haverá informações a serem copiadas. Em seguida, retire a bifurcação de recursos com o DeRez, assim (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 recursos descompilada como um arquivo de texto. Vai parecer algo assim:

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 editar isso se quiser criar um a partir do zero, mas precisa obter o formato exatamente correto ou ele não funcionará. São apenas caracteres codificados em hexadecimal que descrevem o caminho para o pacote de aplicativos que você deseja, terminado com zero.

Você pode ver uma mensagem dizendo que a bifurcação de recursos está vazia e não inicializada. Nesse caso, você não alterou a associação por arquivo no arquivo de origem; portanto, faça isso e execute novamente o comando DeRez.

Depois de ter isso, você pode enviá-lo para outro arquivo da seguinte maneira (assumindo que o arquivo bar.txt exista):

Rez foo.r -a -o bar.txt

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

Para verificar se funcionou bem, já que nem Rez nem DeRez imprimem mensagens de erro, faça o seguinte:

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 correspondem ao curinga.

Fiz isso no 10.7, mas entendo que isso também funcione em máquinas anteriores.

maldade
fonte
Informações interessantes sobre essas ferramentas. Ainda assim, parece que essas ferramentas não fazem nada que o acesso ..namedfork/rsrctambém não faz, correto? Você troca exigindo conhecimento sobre (semi) internos para obter conhecimento sobre ferramentas específicas - não estou convencido de que isso seja melhor.
Daniel Beck
@DanielBeck Você está correto, tanto quanto eu sei. No entanto, como foi dito acima, as informações internas foram alteradas com o Lion, enquanto essas são ferramentas de desenvolvimento estáveis ​​que devem ser independentes de versão. Pessoalmente, acho que o material interno é interessante, mas é mais provável que as ferramentas funcionem em várias plataformas, e prefiro usar as ferramentas suportadas.
mauvedeity
3

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

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

Consulte este tópico se precisar de mais

Papai Noel
fonte
1

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

No entanto, não há uma maneira fácil de fazer isso. A maneira como o LaunchServices encontra qual aplicativo deve 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 openna linha de comando e pedir para usar um aplicativo específico dessa vez. Isso não mudaria nenhuma associação, mas alcançaria o que você diz que deseja, ou seja, abrir um conjunto de arquivos em um aplicativo específico:

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

gostar

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, afastando-se totalmente da linha de comando: consulte este utilitário: http://michelf.com/software/magic-launch/

Florenz Kley
fonte
No seu exemplo específico, open -a TextWrangler *seria ainda mais rápido.
Daniel Beck
sim, mas isso adicionaria a camada de expansão de curinga do shell à explicação, o que tornaria o exemplo menos compreensível :-) não é tão ruim para abrir, mas existem outras ferramentas que apenas convidam para problemas de curinga ...
Florenz Kley