Mac OSX zmienia skojarzenie pliku dla pliku w wierszu polecenia

10

Muszę wsadowo zmienić aplikację związaną z niektórymi plikami za pomocą wiersza polecenia. Nie zamierzam zmieniać powiązania plików dla określonego rozszerzenia pliku, tak naprawdę chcę kierować określone pliki do otwarcia w innej aplikacji niż domyślne skojarzenie dla tego typu pliku. Nie chcę zmieniać domyślnej aplikacji dla tego rozszerzenia plików, tylko dla określonych plików, na które celuję.

W tej chwili wybieram wszystkie pliki, które chcę zmienić w wyszukiwarce, klikam opcję + polecenie + i, aby otworzyć, uzyskać informacje o wielu plikach i zmieniam aplikację dla tych plików. To trochę denerwujące.

Obrabować
źródło

Odpowiedzi:

6

Informacje te są przechowywane w rozwidleniu zasobów pliku ( Wikipedia ). Te widelce zasobów są widoczne jako atrybuty rozszerzone ( 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 

Edycja od podstaw jest prawdopodobnie dość bolesna - wiele danych binarnych:

$ 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

Ale możesz traktować te rozwidlenia zasobów jak pliki. Na przykład:

$ 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 jest to, w jaki sposób rozwidlenie zasobów jest narażone na aplikacje POSIX (tj. prawdopodobnie wszystko, co robisz w Terminalu).

Musisz tylko utworzyć jeden plik „szablonu” z istniejącego rozwidlenia zasobów (w tym przykładzie openInSublime2rsrc), a następnie możesz skopiować go do innych plików.

Daniel Beck
źródło
1
To rozwiązanie działało do Lion. Kopiowanie do pliku / rsrc powoduje błąd „: Nie katalog”. Powrót do pierwszego :(
Rob
1
@Rob Spróbuj użyć somefile.txt/..namedfork/rsrczamiast tego. somefile.txt/rsrczostał wycofany jakiś czas temu.
Daniel Beck
Daniel Beck - jesteś ratownikiem, dziękuję bardzo.
Rob
Nie musisz edytować widelców zasobów bezpośrednio - zobacz moją odpowiedź poniżej, ale podsumowanie jest takie, że możesz używać narzędzi o nazwie Rez i DeRez do edycji widelców zasobów. Ponieważ są to obsługiwane narzędzia programistyczne, prawdopodobieństwo wystąpienia problemu jest mniejsze.
mauvedeity
5

Biorąc pod uwagę powyższą odpowiedź Daniela Becka, informacje te są rzeczywiście przechowywane w rozwidleniu zasobów pliku. Apple udostępnia dwa narzędzia zwane „Rez” i „DeRez” z narzędziami programistycznymi, które pozwalają manipulować widłami zasobów. W szczególności możesz wepchnąć rozwidlenie zasobów do pliku za pomocą Rez.

Aby zmienić powiązanie pojedynczego pliku z wiersza polecenia, najpierw utwórz plik odpowiedniego typu i ręcznie zmień jego powiązanie z aplikacją, w której chcesz go otworzyć. Spowoduje to utworzenie rozwidlenia zasobów w pliku - jeśli nie Aby to zrobić, nie będzie żadnych informacji do skopiowania. Następnie wyciągnij rozwidlenie zasobów za pomocą DeRez, podobnie jak to (zakładając, że plik foo.txt i że aplikacja, której chcesz użyć, to Firefox.app).

DeRez foo.txt > foo.r

Spowoduje to utworzenie pliku o nazwie foo.r, który jest zdekompilowanym rozwidleniem zasobów jako plik tekstowy. Będzie to wyglądać mniej więcej tak:

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

Możesz go edytować, jeśli chcesz utworzyć go od zera, ale musisz uzyskać właściwy format , inaczej nie zadziała. To tylko znaki w kodzie szesnastkowym opisujące ścieżkę do żądanego pakietu aplikacji, zakończone zerem.

Może zostać wyświetlony komunikat informujący, że rozwidlenie zasobów jest puste i niezainicjowane. Jeśli tak, nie zmieniłeś powiązania między plikami w pliku źródłowym, więc musisz to zrobić, a następnie ponownie uruchomić polecenie DeRez.

Gdy to zrobisz, możesz wypchnąć to do innego pliku w następujący sposób (zakładając, że istnieje plik bar.txt):

Rez foo.r -a -o bar.txt

To aktualizuje plik bar.txt w miejscu dzięki rozwidleniu zasobów z foo.r.

Aby sprawdzić, czy działa OK, ponieważ ani Rez, ani DeRez nie drukują komunikatów o błędach, po prostu wykonaj następujące czynności:

DeRez bar.txt

Powinieneś zobaczyć te same informacje, co wcześniej. Po tym wszystkim po prostu otwórz plik bar.txt, jak zwykle, i powinien on otworzyć się we właściwej aplikacji, a nie domyślnej.

Aby dokonać zmiany wsadowej, po utworzeniu pliku .r można użyć standardowego rozszerzenia symboli zastępczych, takiego jak to:

Rez foo.r -a -o *.txt

Spowoduje to wykonanie wszystkich plików pasujących do znaku wieloznacznego.

Zrobiłem to w wersji 10.7, ale rozumiem, że działa to również na wcześniejszych komputerach.

mauvedeity
źródło
Interesujące informacje na temat tych narzędzi. Wygląda jednak na to, że te narzędzia nie robią nic, czego dostęp ..namedfork/rsrcnie robi, prawda? Handlujesz wymagającą wiedzy na temat (pół) wewnętrznych dla wiedzy na temat konkretnych narzędzi - nie jestem przekonany, że to jest lepsze.
Daniel Beck
@DanielBeck O ile wiem, masz rację. Jednak, jak powiedziano wcześniej, informacje wewnętrzne zmieniły się wraz z Lion, podczas gdy są to stabilne narzędzia programistyczne, które powinny być niezależne od wersji. Osobiście uważam, że elementy wewnętrzne są interesujące, ale narzędzia częściej działają na różnych platformach i wolę korzystać z obsługiwanych narzędzi.
mauvedeity
3

Zrobiłem to przy użyciu xattr (działa idealnie na wolumenie APFS)

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

Zobacz ten temat, jeśli potrzebujesz więcej

Święty Mikołaj
źródło
1

Mówisz, że chcesz „zmienić partię” aplikacji powiązanej z danym (pod) zestawem plików danego typu. podzestaw, ponieważ nie chcesz zmieniać wszystkich instancji tego typu pliku na nową aplikację.

Nie ma jednak łatwego sposobu na zrobienie tego. Sposób, w jaki LaunchServices wyszukuje, która aplikacja powinna zostać poproszona o otwarcie pliku, jest procesem wieloetapowym i zależy od ustawień o różnych zakresach (użytkownik, system itp.).

Ale - możesz użyć openw wierszu polecenia i powiedzieć mu, aby tym razem używał określonej aplikacji. Nie zmieni to żadnego powiązania, ale osiągnie to, co chcesz, a mianowicie otworzy zestaw plików w konkretnej aplikacji:

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

lubić

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

i całkowicie odchodząc od wiersza poleceń: spójrz na to narzędzie: http://michelf.com/software/magic-launch/

Florenz Kley
źródło
W twoim konkretnym przykładzie open -a TextWrangler *byłoby jeszcze szybciej.
Daniel Beck
tak, ale to dodałoby do wyjaśnienia warstwę rozszerzenia symboli wieloznacznych powłoki, co uczyniłoby ten przykład mniej zrozumiałym :-) nie jest taki zły dla otwartych, ale są też inne narzędzia, które tylko zapraszają problemy z symbolami wieloznacznymi ...
Florenz Kley