Я иногда работаю с пакетами iTunes Music Store. Эти пакеты имеют .itmsp
расширение. Мол .app
, .itmsp
по сути, это контейнерный каталог. .itmsp
папки содержат XML и медиа-файлы.
Последнее обновление Xcode и / или Mac OS X (Xcode 4.6.1 в Mac OS 10.8.3) похитило ассоциацию типов файлов для каталогов с .itmsp
расширением. Ранее они рассматривались как обычные папки - для просмотра изнутри не требуется двойной щелчок. Теперь я должен дважды щелкнуть их, чтобы взаимодействовать с ними. Когда я это делаю, программа под названием Application Loader пытается открыть их. Чтобы увидеть внутри, я должен щелкнуть правой кнопкой мыши и выбрать «Показать содержимое пакета». Я имею дело с тысячами этих файлов в любой момент времени, так что это не сработает.
Я попытался изменить или удалить сопоставление типов файлов, используя Get Info и RCDefaultApp. Ни то, ни другое не работает. Удаление ассоциации типов файлов просто превращает .itmsp
каталоги в пустые файлы. Как и удаление приложения Loader.app полностью. В любом случае я все еще не могу просмотреть содержимое без щелчка правой кнопкой мыши.
Ранее принятый ответ какое-то время работал lsregister -u /Applications/Contents/Applications/Application\ Loader.app/
хорошо : он перестал работать, так как я обновил XCode и / или Mac OS X. Если у вас установлен XCode, вы сможете проверить это самостоятельно, назвав каталог foo.itmsp
.
Как сделать так, чтобы .itmsp
файлы снова рассматривались как папки?
Ответы:
Проблема: папки .itmsp отображаются в виде файлов
Finder обрабатывает папки .itmsp как пакеты , то есть как если бы они были одним файлом. Например, в представлении столбца все, что содержится в папке .itmsp, невидимо, отображается только значок документа:
Программа Finder считает каталог пакетом, если выполняется любое из следующих условий (из Руководства по программированию пакета ):
Каталог имеет известное расширение имени файла: .app, .bundle, .framework, .plugin, .kext и т. Д. (Как определено в
/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Это двоичный список, откройте его с помощью Xcode:)open -a Xcode Info.plist
.У каталога есть расширение, которое в некоторых других заявках приложения представляет тип пакета (ищите
com.apple.package
в выходных данных,mdls -name kMDItemContentTypeTree <foldername>
чтобы узнать.)В каталоге установлен бит пакета (если
GetFileInfo -ab <foldername>
возвращается1
, он установлен).Случай 2. применяется к папкам .itmsp:
Application Loader.app
экспортирует типcom.apple.itunes-producer.itmsp
и устанавливает его для соответствияcom.apple.package
:Решение: повторно объявить тип
com.apple.itunes-producer.itmsp
Решением было бы повторно объявить тип
com.apple.itunes-producer.itmsp
и расширениеitmsp
как папку и заставить Launch Services использовать измененное объявление типа.Чтобы папки .itmsp отображались в виде папок с помощью Finder, выполните следующие действия:
Откройте Automator в папке «Приложения» и выберите « Приложение» :
Выберите Utilities в списке Library, выберите Run Shell Script и перетащите его на панель справа:
Замените содержимое скрипта по умолчанию на
exit 0
:Сохраните приложение как itmspOpener:
Закрыть Automator.
Выберите
itmspOpener.app
и покажите его содержимое:Найдите Contents> Info.plist и откройте его в вашем любимом редакторе:
Замените эти разделы в
Info.plist
:Свяжите файл .itmsp
itmspOpener
и нажмите кнопку Change All...:Сбросить базу данных Launch Services:
(на OS X 10.8
lsregister
находится в/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)Создайте папку .itmsp и перечислите ее свойства:
Поскольку база данных Launch Services была сброшена, теперь Finder показывает папки .itmsp как папки.
Откройте,
itmspOpener.app
чтобы загрузить свой plist файл и зарегистрируйтесьcom.apple.itunes-producer.itmsp
:Начало
Application Loader.app
:Папка
foo3.itmsp
должна все еще отображаться как папка.Проверьте свойства папки еще раз:
com.apple.package
не был добавлен в атрибуты метаданных папки, поэтому Finder по-прежнему отображает папки .itmsp как папки!Автоматизированное решение: отображение папок .itmsp в виде папок после входа в систему
Чтобы отобразить папки .itmsp как папки после входа в систему:
Создайте
itmspOpener.app
и измените его,Info.plist
как описано выше.Создайте
/usr/local/bin/itmspTypeLoader
с этим содержимым (переменнаяitmspOpener
указывает на место, гдеitmspOpener.app
находится, измените при необходимости):И
sleep 15
до, и после бегаlsregister
имеют первостепенное значение. Если вы не видите желаемого результата, попробуйте другие задержки.Создать
/usr/local/bin/itmspTypeLoaderLauncher
с этим содержанием:Установите оба исполняемых скрипта:
Установить
/usr/local/bin/itmspTypeLoaderLauncher
как хук входа в систему :Перезагрузитесь, чтобы изменения вступили в силу. После входа в систему вы должны увидеть это:
и
lsregister -dump
должен показать, чтоitmspOpener.app
sUTExportedTypeDeclarations
имеет приоритет надApplication Loader.app
s:Вы видите
inactive
флаг, установленный в типе экспорта Application Loader.app? Мы победили загрузчик приложений.Кислотный тест: папки .itmsp по-прежнему отображаются как таковые после обновления iTunes
Я недавно обновил Xcode:
и может подтвердить, что папки .itmsp были показаны как папки во время обновления:
и потом:
Частичное решение: пакет покажет содержимое при двойном щелчке
Как отмечалось ранее, процедура, описанная выше, не будет работать с произвольными папками, которые отображаются как пакеты Finder.
Однако, если вы просто хотите иметь возможность дважды щелкнуть пакет, чтобы открыть его, есть способ сделать это с помощью одного
bash
сценария и Automator:Сценарий создает скрытую временную папку внутри пакета, открывает ее в Finder (таким образом, раскрывая пакет как папку), а затем удаляет временную папку.
Automator объединяет скрипт в приложение, которое будет связано с файлами пакета.
Это шаги для создания такого приложения. Я буду использовать файлы .itmsp в качестве примера типа пакета в пояснении ниже:
Откройте Automator в папке «Приложения» и выберите « Приложение» :
Выберите Utilities в списке Library, выберите Run Shell Script и перетащите его на панель справа:
Установите Pass вход в качестве аргументов :
Замените содержимое скрипта по умолчанию на это:
Сохраните приложение как itmspOpener:
Закрыть Automator.
Теперь у вас есть приложение, которое может открывать файлы .itmsp в виде папок, если они связаны с ним.
Существует косметическая проблема: связанные файлы будут иметь стандартный белый значок документа:
Давайте исправим это тоже:
Убедитесь, что Automator закрыт.
Выберите itmspOpener и покажите его содержимое:
Найдите Contents> Info.plist и откройте его в вашем любимом редакторе:
Замените значение этого ключа в
CFBundleDocumentTypes
массиве:и добавьте этот ключ:
Теперь раздел выглядит так:
Переключитесь в Finder, выберите папку, нажмите ⌘I, выберите значок папки в левом верхнем углу и скопируйте его с помощью ⌘C:
Откройте «Просмотр» и выберите «Файл»> «Создать из буфера обмена». Сохраните файл как
folder.icns
:Скопировать
folder.icns
вitmspOpener/Contents/Resources
:Свяжите файл .itmsp
itmspOpener
и нажмите кнопку Change All...:Значок файлов .itmsp должен измениться на папку, или, по крайней мере, я так подумал: к сожалению, это не так. Поэтому я переместил приложение itmspOpener в другое место (я создал временную папку на рабочем столе, переместил ее туда и обратно на рабочий стол). Это обновило информацию о значке в Finder:
Теперь дважды щелкните файл .itmsp и просмотрите его как папку:
источник
.itmsp
папке, невидимо. Я не могу разобраться почему, но это так. Кроме того, если бы у меня были мои барабанщики, вам бы не пришлось дважды щелкать файл, чтобы посмотреть внутрь, ну да ладно.Один из вариантов - отменить регистрацию Application Loader
lsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/
, но он снова регистрируется, если он открывается, перестраивается база данных Launch Services или, возможно, обновляется Xcode.Вы также можете закомментировать записи в словарях CFBundleDocumentTypes и UTExportedTypeDeclarations
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Info.plist
и запустить ихlsregister -f /Applications/Xcode.app/Contents/Applications/Utilities/Application\ Loader.app/
. Это не делает недействительной подпись кода XCode, но изменения могут быть перезаписаны обновлениями.Полный путь к lsregister находится
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister
в 10.5 и позже.источник
Info.plist
приведет к отмене регистрации типов файлов, удаленных из списка? Я могу вообразить, что это работает, и я могу легко вообразить, что это терпит неудачу. тоже.lsregister -u $app && lsregister $app
кажется, применяет изменения в Info.plist, по крайней мере, в этом случае.CFBundleDocumentTypes
так что вы можете просто удалить этот «инструмент», когда он появится, если он вам не нужен, и / или устал от его модификации.Вот соответствующий отрывок из компании Apple documenation о пучках ( курсив добавлен )
Почти наверняка Xcode представляет, что он утверждает, что
.itmsp
представляет тип пакета, как описано в Пакетах документов . Так что, возможно, удалив это расширение из XCode, у меняInfo.plist
получится, но я подозреваю, что как только эта ассоциация будет замечена Finder, удаление его из XCode не отменит его. Какие «рекомендуемые приложения» вы получаете, если щелкнуть правой кнопкой мыши «Открыть с помощью ...»? Вы должны проверить все их Info.plists.Я предлагаю посмотреть, можете ли вы избежать использования
lsregister -u
регистрации для любых заявленных приложений.itmsp
. В противном случае вам, возможно, придется удалить.itmsp
все списки, а затем уничтожить всю базу данных ассоциации поиска с помощьюlsregister -kill -seed
. Никогда не делал этого, не сообщая, какой ущерб это нанесет остальной части вашей системы. Возможно, вы хотите отменить регистрацию, затем отредактировать списки, затем убить и заново заполнить базу данных. Меня не удивит, если незарегистрированная не удалит ассоциацию, если вы уже удалили ее из списка, и повторно запишет ее, если вы еще не удалили ее. Кроме того, таким образом вы не потеряете все другие ассоциации для оскорбительных приложений.Что еще хуже, XCode мог пройти и установить бит пакета на все папки. Полагаю, тогда вам придется написать сценарий, используя
GetFileInfo
иSetFile
для сканирования диска, и отменить те, что немного болезненно, но выполнимо. Пальцы, пересекшие сверток, остаются неустановленными. Используйте,GetFileInfo
чтобы проверить, протестировав несколько.источник
Я считаю, что вы можете это исправить, используя
/usr/bin/SetFile -a B /path/to/file.itmsp
Проверьте это на одном, прежде чем попробовать на всех остальных, очевидно.
Если вам нужно запустить все из них в заданной папке:
find . -name \*.itmsp -exec /usr/bin/SetFile -a B {} \;
должен сделать это для вас.
источник
SetFile -a B
устанавливает бит пакета На самом деле это должно быть отключеноSetFile -a b
. Но это не будет иметь эффекта, так какHas bundle
бит не установлен:GetFileInfo -ab foo.itmsp
возвращается0
.