Mac OSX mengubah asosiasi file per file pada baris perintah

10

Saya perlu batch mengubah aplikasi yang terkait dengan file tertentu melalui baris perintah. Saya tidak mengubah asosiasi file untuk ekstensi file tertentu, saya sebenarnya mencari untuk menargetkan file tertentu untuk dibuka di aplikasi yang berbeda dari asosiasi default untuk tipe file itu. Saya tidak ingin mengubah aplikasi default untuk ekstensi file ini secara keseluruhan, hanya untuk file spesifik yang saya targetkan.

Saat ini, saya memilih semua file yang ingin saya ubah di finder, menekan opsi + perintah + i untuk membuka dapatkan info untuk banyak file, dan mengubah aplikasi untuk file-file itu. Agak menyebalkan.

rampok
sumber

Jawaban:

6

Informasi ini disimpan dalam garpu sumber daya file ( Wikipedia ). Garpu sumber daya ini diekspos sebagai atribut diperluas ( 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 

Mengedit dari awal mungkin cukup menyakitkan - banyak data biner:

$ 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

Tetapi Anda dapat memperlakukan garpu sumber daya ini seperti file. Sebagai contoh:

$ 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 adalah bagaimana garpu sumber daya terpapar ke aplikasi POSIX (mis. mungkin semua yang Anda lakukan di Terminal).

Jadi, Anda hanya perlu membuat satu file "templat" dari garpu sumber daya yang ada (dalam contoh ini openInSublime2rsrc), dan Anda dapat menyalinnya ke file lain setelahnya.

Daniel Beck
sumber
1
Solusi ini berhasil hingga Lion. Menyalin ke file / rsrc memberi saya kesalahan ": Bukan direktori". Kembali ke titik awal :(
Rob
1
@Rob Coba gunakan somefile.txt/..namedfork/rsrcsaja. somefile.txt/rsrctelah ditinggalkan beberapa waktu lalu.
Daniel Beck
Daniel Beck-Anda penyelamat, terima kasih banyak.
Rob
Anda tidak perlu mengedit garpu sumber daya secara langsung-lihat jawaban saya di bawah, tetapi ringkasannya adalah Anda dapat menggunakan utilitas yang disebut Rez dan DeRez untuk mengedit garpu sumber daya. Karena ini adalah alat pengembang yang didukung, kecil kemungkinan Anda memiliki masalah.
mauvedeity
5

Mengambil dari jawaban Daniel Beck di atas, informasi ini memang disimpan dalam garpu sumber daya file. Apple menyediakan dua utilitas, yang disebut "Rez" dan "DeRez" dengan alat pengembang, yang memungkinkan Anda untuk memanipulasi garpu sumber daya. Secara khusus, Anda dapat mendorong garpu sumber daya ke file dengan Rez.

Untuk mengubah kaitan satu file dari baris perintah, pertama buat file dengan tipe yang tepat, dan secara manual ubah kaitannya dengan aplikasi yang Anda inginkan. Ini menciptakan garpu sumber daya dalam file - jika Anda tidak mau t melakukan ini, tidak akan ada informasi untuk disalin. Kemudian, tarik garpu sumber daya dengan DeRez, seperti ini (dengan asumsi file foo.txt, dan aplikasi yang ingin Anda gunakan adalah Firefox.app).

DeRez foo.txt > foo.r

Ini akan membuat file bernama foo.r yang merupakan fork resource dekompilasi sebagai file teks. Akan terlihat seperti ini:

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

Anda dapat mengedit ini jika Anda ingin membuat satu dari awal, tetapi Anda harus mendapatkan format persis benar atau tidak akan bekerja. Itu hanya karakter hex-encoded yang menggambarkan jalur ke bundel aplikasi yang Anda inginkan, diakhiri dengan nol.

Anda mungkin melihat pesan yang mengatakan bahwa garpu sumber daya kosong dan belum diinisialisasi. Jika demikian, Anda belum mengubah asosiasi per-file pada file sumber, jadi Anda harus melakukannya, lalu jalankan kembali perintah DeRez.

Setelah Anda memiliki ini, Anda dapat mendorong ini ke file lain sebagai berikut (dengan asumsi bar.txt ada):

Rez foo.r -a -o bar.txt

Bar.txt ini diperbarui di tempat dengan garpu sumber daya dari foo.r.

Untuk memeriksanya berfungsi dengan baik, karena baik Rez maupun DeRez tidak mencetak pesan kesalahan, lakukan saja ini:

DeRez bar.txt

Anda harus melihat informasi yang sama seperti sebelumnya. Setelah semua itu, cukup buka file bar.txt seperti biasa, dan itu akan terbuka di aplikasi yang benar, bukan yang default.

Untuk melakukan perubahan batch, setelah Anda memiliki file .r, maka Anda dapat menggunakan ekspansi wildcard standar seperti ini:

Rez foo.r -a -o *.txt

Itu akan melakukan semua file yang cocok dengan wildcard.

Saya telah melakukan ini pada 10.7, tetapi ini adalah pemahaman saya bahwa ini bekerja pada mesin sebelumnya juga.

ungu muda
sumber
Informasi menarik tentang alat-alat ini. Namun, sepertinya alat-alat ini tidak melakukan apa-apa yang tidak dilakukan dengan mengakses ..namedfork/rsrc, benar? Anda berdagang yang membutuhkan pengetahuan tentang (semi) internal untuk pengetahuan tentang alat khusus - saya tidak yakin ini lebih baik.
Daniel Beck
@DanielBeck Anda benar, sejauh yang saya tahu. Namun, seperti dikatakan upthread, informasi internal berubah dengan Lion, sedangkan ini adalah alat dev stabil yang harus versi-independen. Secara pribadi, saya pikir hal-hal internal menarik, tetapi alat lebih cenderung bekerja lintas platform, dan saya lebih suka menggunakan alat yang didukung.
mauvedeity
3

Saya melakukannya menggunakan xattr (berfungsi dengan baik pada volume APFS)

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

Lihat topik ini jika Anda membutuhkan lebih banyak

Sinterklas
sumber
1

Anda mengatakan Anda ingin "mengubah batch" aplikasi yang terkait dengan set (sub-) file tertentu, dari tipe tertentu. sub-set karena Anda tidak ingin mengubah semua instance dari jenis file itu ke aplikasi baru itu.

Namun, tidak ada cara mudah untuk melakukan ini. Cara bagaimana LaunchServices menemukan aplikasi mana yang harus diberitahu untuk membuka file adalah proses multistage, dan tergantung pada pengaturan dengan cakupan yang berbeda (pengguna, sistem dan sebagainya).

Tetapi - Anda dapat menggunakan openpada commandline dan menyuruhnya untuk menggunakan aplikasi tertentu saat ini. Ini tidak akan mengubah asosiasi apa pun, tetapi itu akan mencapai apa yang Anda katakan Anda inginkan, yaitu membuka satu set file dalam aplikasi tertentu:

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

Suka

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

dan, pergi sepenuhnya dari baris perintah: lihat utilitas ini: http://michelf.com/software/magic-launch/

Florenz Kley
sumber
Dalam contoh spesifik Anda, open -a TextWrangler *akan lebih cepat.
Daniel Beck
ya, tapi itu akan menambah lapisan ekspansi wildcard shell ke penjelasan, yang akan membuat contoh kurang dimengerti :-) tidak terlalu buruk untuk terbuka, tetapi ada alat lain yang hanya mengundang masalah wildcard ...
Florenz Kley