我想要能够确定如果一个目录,如a'。应用程序被认为是一揽子束或离搜索的观点上的命令行。我不认为这将难以做一个小壳的程序,但是我宁愿不要重新发明轮子,如果我没有。

有帮助吗?

解决方案

更新:

在所有系统用聚光灯,使用 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 还有,它应该显示作为一揽子通过搜索。当然,一切与"捆绑"的名称意味着,但已经不是所有的软件包是捆(束的特定子集的软件包,有一个明确定义的目录的结构)。


旧的回答:

你可以得到一个列表中的所有已注册的文件类型扩展,使用本命令(OS X前豹):

/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

每种文件有标志。如果包装标志,这是一个软件包。

E.g。

  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或不能或是否束位置或不,你可能赶上一些甚至许多束,但是你不能抓住所有的人。这是数据库的搜索器使用以确定

  • 这是目录束或不?
  • 这是一个已知的文件的扩展或没有?
  • 这应当以下列出的"开放"对于这个文件的类型?
  • 这标,我应该用于显示这种文件的类型?

和更多一些东西。

[编辑:加入路径豹,由于哈格琳的更新]

其他提示

这有点晚了,但是:看起来你可以使用mdls命令检测bundle。具体来说,(多行)输出:

mdls -name kMDItemContentTypeTree /Path/To/Directory

将包含字符串

"com.apple.package"

(包括引号,至少是Lion的引号),如果目录是一个包。如果包也是一个包,则输出也将包含

"com.apple.bundle"

,最后但并非最不重要的是,如果它是一个特定的应用程序包,输出也将包含

"com.apple.application-bundle"

(根据一些非常有限的测试,但是根据Apple关于统一类型标识符的文档和mdls的手册页,这应该成立。对于我测试的项目,这对于非Apple提供的情况也是如此捆绑也是如此,这是UTI目的所期望的。)

虽然可以确定一些束存在基于'./内容/信息。plist",它不需要对所有捆绑的类型(例如文件和遗产束).搜索还确定了一个目录,作为一束基于文件的扩展(.应用程序,.束,等等)或者如果捆绑的位置。

检查束位从命令行使用:

getFileInfo -aB directory_name

为了抓住所有情况下,我会检查:

  • 是的束的位置?
  • 如果没有,没有一个文件的扩展,识别它作为一个包?(见 Mecki的答案)
  • 如果不是,它可能不是一个束。

<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>

应该有一种方法可以从命令行轻松完成,因为作为AppleScript用户,我可以使用系统事件来完成。因此,如果所有其他方法都失败了,您可以从命令行执行必要的AppleScript,如下所示:

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

结果是

true

一个包应该总是有一个文件`./contents/Info.plist'。您可以在目录中检查是否存在,如果是,那么它是一个包/包。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top