Mac OSX змінити об'єднання файлів на файл у командному рядку


10

Мені потрібно пакетно змінити додаток, пов’язаний з певними файлами через командний рядок. Я не хочу змінювати асоціацію файлів для певного розширення файлу, я дійсно прагну націлити конкретні файли, які потрібно відкрити в іншому додатку, ніж асоціація за замовчуванням для цього типу файлів. Я не хочу змінювати програму за замовчуванням для цього розширення файлу в цілому, лише для конкретних файлів, на які я націлений.

Зараз я вибираю всі файли, які я хочу змінити в Finder, натиснувши варіант + команда + i, щоб відкрити отримання інформації про декілька файлів, і зміну програми для цих файлів. Це щось дратує.

Відповіді:


6

Ця інформація зберігається у роздрібному ресурсі файлу ( 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 

Редагування з нуля, мабуть, досить болісно - багато двійкових даних:

$ 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

Але ви можете ставитися до таких ресурсів як до файлів. Наприклад:

$ 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 так описується вилка ресурсу для POSIX-програм (тобто, мабуть, все, що ви робите в Терміналі).

Тож вам просто потрібно створити один файл «шаблону» з наявної вилки ресурсу (у цьому прикладі openInSublime2rsrc), а потім зможете скопіювати його в інші файли.


1
Це рішення працювало до Лева. Копіювання у файл / rsrc призводить до помилки ": Не каталог". Назад до першого :(
Роб

1
@Rob Спробуйте використовувати somefile.txt/..namedfork/rsrcзамість цього. somefile.txt/rsrcбула застаріла деякий час тому.
Даніель Бек

Даніель Бек - ти рятівник, дуже дякую.
Роб

Вам не потрібно безпосередньо редагувати вилки ресурсів - дивіться мою відповідь нижче, але резюме полягає в тому, що ви можете використовувати утиліти під назвою Rez і DeRez для редагування вилок ресурсів. Оскільки ці підтримуються інструменти для розробників, у вас менше шансів виникнути проблеми.
мавп

5

Збираючись з відповіді Даніеля Бека вище, ця інформація дійсно зберігається у роздрібному ресурсі файлу. Apple надає дві утиліти, під назвою "Rez" і "DeRez" з інструментами для розробників, які дозволяють маніпулювати вилами ресурсів. Зокрема, ви можете натиснути виделку ресурсу у файл з Rez.

Щоб змінити асоціацію одного файлу з командного рядка, спершу створіть файл потрібного типу та вручну змініть його асоціацію на додаток, у якому ви хочете його відкрити. Це створює ресурсну вилку ресурсу у файлі - якщо ви цього не зробите ' t це робити, не буде відомостей для копіювання. Потім витягніть вилку ресурсу з DeRez, як це (припустимо, файл foo.txt, і що програма, яку ви хочете використовувати, це Firefox.app).

DeRez foo.txt > foo.r

Це створить файл під назвою foo.r, який є декомпільованою виделкою ресурсу як текстовий файл. Це буде виглядати приблизно так:

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

Ви можете відредагувати це, якщо ви хочете створити його з нуля, але ви повинні мати правильний формат , інакше він не працюватиме. Це просто шістнадцяткові закодовані символи, що описують шлях до потрібного пакету додатків, завершений нулем.

Можливо, ви побачите повідомлення про те, що виделка ресурсу порожня та неініціалізована. Якщо це так, ви не змінили асоціації на файл у вихідному файлі, тому вам потрібно зробити це, а потім запустити команду DeRez.

Після цього ви можете пересунути це в інший файл наступним чином (якщо припустимо bar.txt):

Rez foo.r -a -o bar.txt

Це оновлення bar.txt замість вилки ресурсу від foo.r.

Щоб перевірити це справно, оскільки ні Rez, ні DeRez не надрукували повідомлення про помилки, просто зробіть це:

DeRez bar.txt

Ви повинні побачити ту ж інформацію, що і раніше. Зрештою, просто відкрийте файл bar.txt, як зазвичай, і він має відкритись у правильній програмі, а не за замовчуванням.

Щоб змінити пакет, коли у вас є .r файл, ви можете використовувати стандартне розширення підстановки таким чином:

Rez foo.r -a -o *.txt

Це зробить усі файли, які відповідають підстановці.

Я зробив це 10.7, але я розумію, що це працює і на більш ранніх машинах.


Цікава інформація про ці інструменти. Тим не менш, схоже, ці інструменти нічого не роблять, що доступ ..namedfork/rsrcтакож не робить, правда? Ви торгуєте, вимагаючи знань про (напів) внутрішні для знань про конкретні інструменти - я не переконаний, що це краще.
Даніель Бек

@DanielBeck Ви маєте рацію, наскільки я знаю. Однак, як було сказано вдруге, інформація про внутрішню інформацію змінилася з Lion, тоді як це стабільні інструменти розробки, які не залежать від версій. Особисто я вважаю, що внутрішні матеріали цікаві, але інструменти, швидше за все, працюють на платформі, і я вважаю за краще використовувати підтримувані інструменти.
мавд


1

Ви говорите, що хочете "змінити пакет" програми, пов'язаного з заданим (під-) набором файлів, заданого типу. підмножина, оскільки ви не хочете змінювати всі екземпляри цього типу файлів на нову програму.

Однак простий спосіб це зробити не існує. Спосіб пошуку LaunchServices, якій програмі слід сказати, щоб відкрити файл, є багатоступеневим процесом і залежить від налаштувань з різними областями (користувачем, системою тощо).

Але - ви можете скористатися openкомандним рядком і сказати йому, щоб цього разу використовувати певний додаток. Це не змінить жодної асоціації, але це дозволить досягти того, що ви скажете, що хочете, а саме відкрити набір файлів у конкретній програмі:

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

подібно до

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

і, повністю відійшовши від командного рядка: погляньте на цю утиліту: http://michelf.com/software/magic-launch/


У вашому конкретному прикладі open -a TextWrangler *було б ще швидше.
Даніель Бек

так, але це додало б шару розширення шаблону шаблону до пояснення, що зробило б приклад менш зрозумілим :-) не так вже й погано для відкритих, але є й інші інструменти, які просто запрошують проблеми з підстановкою ...
Флоренц Клей,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.