Mac OSX изменяет сопоставление файлов для каждого файла в командной строке

10

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

Прямо сейчас я выбираю все файлы, которые я хочу изменить в поиске, нажимая опцию + команда + i, чтобы открыть окно получения информации для нескольких файлов, и меняя приложение для этих файлов. Это немного раздражает.

обкрадывать
источник

Ответы:

6

Эта информация хранится в ветке ресурсов файла ( Википедия ). Эти ветки ресурсов представлены как расширенные атрибуты ( Википедия ):

$ 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 для редактирования вилок ресурсов. Так как это поддерживаемые инструменты разработчика, у вас меньше шансов столкнуться с проблемой.
Mauvedeity
5

Продолжая ответ Дэниела Бека, приведенный выше, эта информация действительно хранится в ветке ресурсов файла. Apple предоставляет две утилиты, называемые «Rez» и «DeRez» с инструментами разработчика, которые позволяют вам манипулировать ветвями ресурсов. В частности, вы можете вставить ветку ресурса в файл с помощью Rez.

Чтобы изменить сопоставление отдельного файла из командной строки, сначала создайте файл правильного типа и вручную измените его сопоставление на приложение, в котором вы хотите его открыть. Это создает в файле ветвь ресурса - если вы не Для этого не будет информации для копирования. Затем извлеките ветвь ресурса с помощью 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, но я понимаю, что это работает и на более ранних машинах.

mauvedeity
источник
Интересная информация об этих инструментах. Тем не менее, похоже, что эти инструменты не делают ничего, чего ..namedfork/rsrcне делает доступ , верно? Вы торгуете, требуя знания о (полу) внутренних органах для знания о конкретных инструментах - я не уверен, что это лучше.
Даниэль Бек
@DanielBeck Вы правы, насколько я знаю. Однако, как было сказано выше, внутренняя информация изменилась с Lion, тогда как это стабильные инструменты разработки, которые должны быть независимыми от версии. Лично я думаю, что внутреннее оборудование интересно, но инструменты, скорее всего, будут работать кроссплатформенно, и я бы предпочел использовать поддерживаемые инструменты.
mauvedeity
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 *будет еще быстрее.
Даниэль Бек
да, но это добавило бы к объяснению слой расширения с подстановочными символами оболочки, что сделало бы пример менее понятным :-) не так уж плохо для открытия, но есть и другие инструменты, которые просто вызывают проблемы с подстановочными знаками ...
Florenz Kley