在 Mac OS X 中,双击文件名时,该文件将使用创建该文件的应用程序打开。因此,在 Mac OS X 文件的文件描述中,一定存储了有关哪个应用程序创建了此文件的信息。请注意,这不是文件扩展名,文件可以有任何扩展名,也可以根本没有扩展名。
关于此信息有两个问题:
如何搜索将打开特定应用程序的所有文件?
如何查看和更改打开某个文件的应用程序?
答案1
打开文件的应用程序由商品种类。例如,“纯文本文档”将使用 TextMate 打开,而“TextWrangler 文本文档”将使用 TextWrangler 打开。应用程序本身负责提供这些项目类型,并将它们分配给文件,然后 OS X 将选择使用哪个应用程序来打开它们。
您可以使用以下命令检查单个文件的信息mdls
:
mdls -name kMDItemKind -raw some-file.txt
因此,要搜索所有可以使用 TextMate 打开的文件,请使用特定的搜索命令进行搜索商品种类:
mdfind 'kMDItemKind == "Plain text document"'
您还可以将此搜索限制到某个文件夹:
mdfind -onlyin /some/folder 'kMDItemKind == "Plain text document"'
现在,如何找出应用程序提供的这些“项目种类”字符串?
转到您感兴趣的应用程序文件,然后右键单击它。选择显示包装内容...并导航至内容/资源。 打开信息列表。
在这里,您可以找到应用程序可以处理的文档类型,包括其文档类型名称,这正是您可以使用 进行搜索的那个mdfind
。
如何查看和更改打开某个文件的应用程序?
选择文件,右键单击并单击获取信息. 更改列出的应用程序打开用:
另一个用于维护默认应用程序和关联的有用应用程序是RC默认应用。
答案2
如果你更改单个文件的程序关联,它将存储在扩展属性命名com.apple.ResourceFork
(AFAICT,始终在偏移量处0x108
)并且可以使用从命令行访问xattr
。
ls -l@
可以在命令行上使用以下命令列出文件的扩展属性:
$ ls -la@ test.png
-rw-r--r--@ 1 danielbeck staff 23580 23 Jun 20:26 test.png
com.apple.FinderInfo 32
com.apple.ResourceFork 1338
com.apple.metadata:kMDItemIsScreenCapture 42
com.apple.metadata:kMDItemScreenCaptureType 51
例如,我明确选择了预览作为应用程序打开文件获取信息窗户。
$ xattr -p -l com.apple.ResourceFork test.png
com.apple.ResourceFork:
00000000 00 00 01 00 00 00 05 08 00 00 04 08 00 00 00 32 |...............2|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 04 04 00 00 00 1A 2F 41 70 70 6C 69 63 61 |......../Applica|
00000110 74 69 6F 6E 73 2F 50 72 65 76 69 65 77 2E 61 70 |tions/Preview.ap|
00000120 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |p...............|
[snip]
较旧的 OS X 版本支持使用创建者代码确定打开特定文件的应用程序。某些应用程序仍会写入它们,可以通过使用 检查文件的 Spotlight 元数据来访问它们mdls
。在示例中,我检查了.pxm
由 Pixelmator 创建的文件。
$ mdls test.pxm
kMDItemAlternateNames = (
"test.pxm"
)
kMDItemContentCreationDate = 2012-06-23 18:23:04 +0000
kMDItemContentModificationDate = 2012-06-23 18:24:12 +0000
kMDItemContentType = "com.pixelmator.pxm"
kMDItemContentTypeTree = (
"com.pixelmator.pxm",
"public.image",
"public.data",
"public.item",
"public.content"
)
kMDItemDateAdded = 2012-06-23 18:23:04 +0000
kMDItemDisplayName = "test"
kMDItemFSContentChangeDate = 2012-06-23 18:24:12 +0000
kMDItemFSCreationDate = 2012-06-23 18:23:04 +0000
kMDItemFSCreatorCode = "PXMT"
[...]
示例输出的最后一行显示了 Pixelmator 设置的创建者代码:PXMT
。