我希望能够在命令行上从Finder的角度确定一个目录(例如'.app')是否被视为包或捆绑包。我认为使用一个小的shell程序来完成这个任务并不难,但如果不必要的话,我不想重新发明轮子。
我希望能够在命令行上从Finder的角度确定一个目录(例如'.app')是否被视为包或捆绑包。我认为使用一个小的shell程序来完成这个任务并不难,但如果不必要的话,我不想重新发明轮子。
可能有点晚了,但是:似乎你可以使用mdls命令来检测bundle。具体来说,是通过以下(多行)输出进行的:
mdls -name kMDItemContentTypeTree /Path/To/Directory
将包含该字符串
"com.apple.package"
在Lion版本中,如果目录是一个包(package),那么输出的结果会至少包括双引号。如果这个包同时也是一个捆绑(bundle),那么输出的结果还会包含其他内容。
"com.apple.bundle"
而且,最后但并非最不重要的,如果它是一个应用程序捆绑包,输出也将包含
"com.apple.application-bundle"
(这是根据一些非常有限的测试得出的,但根据苹果关于统一类型标识符的文档和mdls的手册,这应该是正确的。对于我测试过的项目,对于非苹果提供的捆绑包也是如此,鉴于UTI的目的,这是你所期望的。)
虽然你可以通过存在 './contents/Info.plist' 来识别一些捆绑包,但并不是所有类型的捆绑包都需要这个文件(例如文档和旧版捆绑包)。Finder 还可以根据文件扩展名(.app、.bundle 等)或者捆绑包位是否设置来将目录识别为捆绑包。
要从命令行检查捆绑包位,请使用:
getFileInfo -aB directory_name
对于所有带有 Spotlight 的系统,您可以使用 mdls
命令检测包。查看 kMDItemContentTypeTree 属性即可。例如:
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显示为一个包。当然,所有带有“bundle”名称的东西都已经暗示了这一点,但并不是所有的包都是捆绑包(捆绑包是具有明确定义的目录结构的包的特定子集)。
你可以使用以下命令(Leopard之前的OS X版本)获取所有注册文件类型扩展名的列表:
/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump
或者适用于Leopard及更高版本:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
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'
以及其他一些内容。
[编辑:感谢Hagelin更新,添加了Leopard的路径]
<插件>
我的启动工具有这个功能。例如:
% 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