确定目录是Mac OS X终端中的捆绑包还是包?

amr*_*rox 2 macos terminal

我希望能够确定在命令行上从Finder的角度来看,诸如'.app'之类的目录是否被视为包或包.我认为这对于一个小型的shell程序来说并不困难,但如果我不需要,我宁愿不重新发明轮子.

小智 6

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

mdls -name kMDItemContentTypeTree /Path/To/Directory
Run Code Online (Sandbox Code Playgroud)

将包含字符串

"com.apple.package"
Run Code Online (Sandbox Code Playgroud)

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

"com.apple.bundle"
Run Code Online (Sandbox Code Playgroud)

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

"com.apple.application-bundle"
Run Code Online (Sandbox Code Playgroud)

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


Mec*_*cki 4

更新:

在所有具有 Spotlight 的系统上,mdls您可以通过查看 kMDItemContentTypeTree 属性来检测包。例如:

mdls -name kMDItemContentTypeTree "/Applications/Safari.app"
Run Code Online (Sandbox Code Playgroud)

为我产生以下输出

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"
)
Run Code Online (Sandbox Code Playgroud)

无论何时你看到com.apple.package那里,它都应该被 Finder 显示为一个包。当然,名称中带有“bundle”的所有内容都意味着已经但并非所有包都是包(包是具有明确定义的目录结构的包的特定子集)。


旧答案:

您可以使用以下命令获取所有已注册文件类型扩展名的列表(Leopard 之前的 OS X):

/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump
Run Code Online (Sandbox Code Playgroud)

或者对于 Leopard 及更高版本:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
Run Code Online (Sandbox Code Playgroud)

每个文件扩展名都有标志。如果设置了包标志,则这是一个包。

例如

  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
Run Code Online (Sandbox Code Playgroud)

将此文件与非捆绑文件进行比较

    claim   id:            2484731904
            name:          TEXT
            role:          viewer
            flags:         apple-internal  
            icon:          
            bindings:      .txt, .text, 'TEXT'
Run Code Online (Sandbox Code Playgroud)

真正获得所有捆绑包的唯一方法是在 LaunchService 数据库(我们上面转储的数据库)中查找。如果你只看它是否有plist或者是否设置了bundle位,你可能会捕获一些甚至许多bundle,但你不能捕获所有的bundle。这是 Finder 用来确定的数据库

  • 该目录是否是捆绑包?
  • 这是一个已知的文件扩展名吗?
  • 对于该文件类型,哪些应用程序应列在“打开方式”下?
  • 我应该使用哪个图标来显示此文件类型?

还有一些其他的东西。

[编辑:添加了 Leopard 的路径,感谢 Hagelin 的更新]