使用Python识别Mac OS X中的包目录
Mac OS X Finder使用“包”的概念,使某些文件夹的内容对用户不透明。我正在使用使用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元数据,据我所知,这些元数据是从文件/目录本身填充的。这让我想
os.walk()
枚举目录树,我想跳过对包(如应用程序包)的枚举
mdls
命令行实用程序可用于检查com.apple.package
是否位于kMDItemContentTypeTree
属性中。是否是检测文件夹是否是要放入os.system
并在检测到该操作系统确实存在后使用mdls
的包的唯一/最佳方法
另外,这个解决方案似乎依赖于Spotlight元数据,据我所知,这些元数据是从文件/目录本身填充的。这让我想知道是否有一种方法可以检查目录是否是mdls
之外的包。也许我遗漏了什么。通常由它们的扩展来定义。只需创建一个扩展名为.app
的目录,就可以在Finder中将其显示为(已损坏的)应用程序
列出了定义捆绑包的以下方法:
如果满足以下任一条件,则查找程序将目录视为包:
- 该目录具有已知的文件扩展名:.app、.bundle、.framework、.plugin、.kext等
- 目录有一个扩展名,其他一些应用程序声明它代表一个包类型;请参阅“文档包”
- 目录已设置其包位
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
工具更简单。