使用Python识别Mac OS X中的包目录

使用Python识别Mac OS X中的包目录,python,macos,metadata,spotlight,Python,Macos,Metadata,Spotlight,Mac OS X Finder使用“包”的概念,使某些文件夹的内容对用户不透明。我正在使用os.walk()枚举目录树,我想跳过对包(如应用程序包)的枚举 mdls命令行实用程序可用于检查com.apple.package是否位于kMDItemContentTypeTree属性中。是否是检测文件夹是否是要放入os.system并在检测到该操作系统确实存在后使用mdls的包的唯一/最佳方法 另外,这个解决方案似乎依赖于Spotlight元数据,据我所知,这些元数据是从文件/目录本身填充的。这让我想

Mac OS X Finder使用“包”的概念,使某些文件夹的内容对用户不透明。我正在使用
os.walk()
枚举目录树,我想跳过对包(如应用程序包)的枚举

mdls
命令行实用程序可用于检查
com.apple.package
是否位于
kMDItemContentTypeTree
属性中。是否是检测文件夹是否是要放入
os.system
并在检测到该操作系统确实存在后使用
mdls
的包的唯一/最佳方法

另外,这个解决方案似乎依赖于Spotlight元数据,据我所知,这些元数据是从文件/目录本身填充的。这让我想知道是否有一种方法可以检查目录是否是
mdls
之外的包。也许我遗漏了什么。

通常由它们的扩展来定义。只需创建一个扩展名为
.app
的目录,就可以在Finder中将其显示为(已损坏的)应用程序

列出了定义捆绑包的以下方法:

如果满足以下任一条件,则查找程序将目录视为包:

  • 该目录具有已知的文件扩展名:.app、.bundle、.framework、.plugin、.kext等
  • 目录有一个扩展名,其他一些应用程序声明它代表一个包类型;请参阅“文档包”
  • 目录已设置其包位
指定包的首选方法是为包目录提供已知的文件扩展名。在大多数情况下,Xcode通过提供应用正确扩展的模板来为您解决这一问题。您所要做的就是创建一个适当类型的Xcode项目

检测包的最简单方法就是检测那些扩展。快速而肮脏的方法是使用上述文档作为指南,简单地查找硬编码的扩展列表

下一步是查询操作系统是否已将给定扩展注册为文档包。看

要检测目录上的包位,必须使用检索
u'com.apple.FinderInfo'
键,然后使用解码返回的二进制数据;
kHasBundle
标志为0x2000:

attrs = xattr.getxattr('/path/to/dir', u'com.apple.FinderInfo')
ispackage = bool(ord(attrs[8]) & 0x20)  # I *think* this is correct; works for hidden dirs and & 0x40

如果您决定使用
mdls
,请使用而不是
os.system
。谢谢,@nofina解决了问题的关键(以及高效实现的方法)需要能够在系统中查询一次所有扩展名的列表,这些扩展名应被视为文档包,而且即使在您提供的指向其他问题的链接中,似乎也没有一种简单的方法可以做到这一点,除非我遗漏了什么。该链接概述了一种针对系统测试单个扩展的方法,有点像在黑暗中射击。尽管如此,您在xattr代码和kHasBundle代码方面还是帮了我不少忙。我已经阅读了您提供的链接,在Objective-C中似乎没有一种优雅的方式来实现这一点,更不用说Python了!没有,我也没有找到更好的方法。看起来
mdls
工具更简单。