Определить, является ли каталог пакетом в терминале Mac OS X? - PullRequest
2 голосов
/ 23 сентября 2008

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

Ответы [ 6 ]

6 голосов
/ 02 сентября 2012

Это немного поздно, но: кажется, вы можете обнаружить пакеты, используя команду mdls. В частности, (многострочный) выход:

mdls -name kMDItemContentTypeTree /Path/To/Directory

будет содержать строку

"com.apple.package"

(включая кавычки, по крайней мере, для Lion) где-нибудь, если каталог является пакетом. Если пакет также является пакетом, вывод также будет содержать

"com.apple.bundle"

и, наконец, что не менее важно, если это определенно пакет приложений, вывод также будет содержать

"com.apple.application-bundle"

(Это в соответствии с некоторыми очень ограниченными испытаниями, но из документации Apple по унифицированным идентификаторам типов и справочной страницы для mdls, это должно сохраняться. И для тестируемых элементов это было верно для сторонних производителей). также связки, что вы и ожидали, учитывая назначение ИМП.)

4 голосов
/ 23 сентября 2008

Несмотря на то, что вы можете идентифицировать некоторые пакеты на основе существования './contents/Info.plist ", это не требуется для всех типов пакетов (например, документов и устаревших пакетов). Средство поиска также определяет каталог как основанный на пакете на расширение файла (.app, .bundle и т. д.) или если установлен бит пакета.

Для проверки бита пакета из командной строки используйте:

getFileInfo -aB directory_name

Чтобы отследить все случаи, я бы проверил:

  • Установлен ли бит пакета?
  • Если нет, имеет ли он расширение файла, которое идентифицирует его как пакет? (см. ответ Меки )
  • Если нет, то, вероятно, это не пакет.
3 голосов
/ 23 сентября 2008

Обновление:

Во всех системах с Spotlight, используя mdls, вы можете обнаруживать пакеты, глядя на свойство kMDItemContentTypeTree. E.g.:

mdls -name kMDItemContentTypeTree "/Applications/Safari.app"

производит для меня следующий вывод

kMDItemContentTypeTree = (
    "com.apple.application-bundle",
    "com.apple.application",
    "public.executable",
    "com.apple.localizable-name-bundle",
    "com.apple.bundle",
    "public.directory",
    "public.item",
    "com.apple.package"
)

Всякий раз, когда вы видите com.apple.package, он должен отображаться Finder как пакет. Конечно, все, что имеет в названии «комплект», подразумевает, что уже, но не все пакеты являются пакетами (комплекты представляют собой определенное подмножество пакетов, которые имеют четко определенную структуру каталогов).


Старый ответ:

Вы можете получить список всех зарегистрированных расширений типов файлов, используя эту команду (OS X до Leopard):

/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump

или для Леопарда и позже:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump

У каждого расширения файла есть флаги. Если установлен флаг пакета, это пакет.

1024 * Е.Г. *

  claim   id:            806354944
            name:          Bundle
            role:          none
            flags:         apple-internal  relative-icon-path  package  
            icon:          Contents/Resources/KEXT.icns
            bindings:      .bundle
    --------------------------------------------------------
    claim   id:            1276116992
            name:          Plug-in
            role:          none
            flags:         apple-internal  relative-icon-path  package  
            icon:          Contents/Resources/KEXT.icns
            bindings:      .plugin

Сравните это с файлом без пакета

    claim   id:            2484731904
            name:          TEXT
            role:          viewer
            flags:         apple-internal  
            icon:          
            bindings:      .txt, .text, 'TEXT'

Единственный способ действительно получить все пакеты - это поискать в базе данных LaunchService (той, которую мы вывалили выше). Если вы просто узнаете, есть ли у него plist или нет, или установлен бит пакета, вы можете перехватить некоторые или даже много пакетов, но вы не можете перехватить все из них. Это база данных, которую Finder использует для определения

  • Является ли этот каталог связкой или нет?
  • Это известное расширение файла или нет?
  • Какие приложения должны быть перечислены в разделе «Открыть с помощью» для этого типа файлов?
  • Какой значок я должен использовать для отображения файлов этого типа?

и еще кое-что.

[EDIT: добавлен путь для Leopard, спасибо Hagelin за обновление]

1 голос
/ 12 апреля 2009

<plug>

Мой запуск инструмент имеет функцию для этого. Например:

% launch -f Guards.oo3 
Guards.oo3: non-application package 
    type: ''    creator: ''
    kind: OmniOutliner 3
    content type ID: com.omnigroup.omnioutliner.oo3-package
    contents: 1 item
    created: 3/6/09 3:36:50 PM
    modified: 3/6/09 4:06:13 PM
    accessed: 4/12/09 1:10:36 PM [only updated by Mac OS X]
    backed up: 12/31/03 6:00:00 PM

% launch -f /Applications/Safari.app
/Applications/Safari.app: scriptable Mac OS X application package 
    type: 'APPL'    creator: 'sfri'
    architecture: PowerPC 7400, Intel 80x86
    bundle ID: com.apple.Safari
    version: 4 Public Beta
    kind: Application
    content type ID: com.apple.application-bundle
    contents: 1 item
    created: 8/21/07 5:11:33 PM
    modified: 2/24/09 7:29:51 PM
    accessed: 4/12/09 1:10:51 PM [only updated by Mac OS X]
    backed up: 12/31/03 6:00:00 PM

Вы должны быть в состоянии получить то, что хотите, проверив, заканчивается ли первая строка вывода 'package'.

launch также в Fink и MacPorts.

</plug>

0 голосов
/ 12 апреля 2009

Должен быть способ сделать это легко из командной строки, потому что, как пользователь AppleScript, я могу сделать это с помощью системных событий. Таким образом, если ничего не помогает, вы можете выполнить необходимый AppleScript из командной строки следующим образом:

$ FILE=/Users/myuser/Desktop/foo.rtfd
$ osascript -e "tell application \"System Events\" to get package folder of alias POSIX file \"${FILE}\""

результат

true
0 голосов
/ 23 сентября 2008

В комплекте всегда должен быть файл `./contents/Info.plist '. Вы можете проверить наличие этого в каталоге, если это так, то это пакет / пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...