首页 > 代码库 > 在Mac OS X上利用Spotlight搜索代码

在Mac OS X上利用Spotlight搜索代码

用grep来搜代码和方便,最原生态了,常用的:

? ~ grep ‘NuPlayer‘ -iInr --color ./aosp

其中`i`表示大小写忽略;`I`表示忽略binary文件;`n`显示搜索结果的行号;`r`表示递归搜索子目录


不过grep搜索有点慢,网上也很多通过建立索引加快搜索速度的方法:“other grep-like tools and indexing tools”

一向用户体验著称的Mac指定不会缺少这个,`Spotlight`就是系统自带的基于索引搜索工具,使用起来也很简单,ctrl+space呼出。如果想调到搜索结果文件所在的目录,就按住Command键鼠标进入.


`Spotlight`当然有自定义更强的命令行版:`mdfind`。如上面搜索命令可以这么玩:

? ~ mdfind ‘NuPlayer‘ -onlyin ./aosp | xargs grep ‘NuPlayer‘ -iInr --onlyin ./aosp

这样的速度在搜索像android代码里会快好几十倍。其中`-onlyin`告诉命令仅仅在这个目录里找,要不然会在整个硬盘上搜(不过也很快).不妨做个函数放在`bash_profile`里:

function fastfind {mdfind $@ -onlyin . | xargs grep $@ -riIn .;}


由于索引的限制,`mdfind`搜索对象不支持正则表达式,不过这几个应该够用:

  • mdfind ‘‘str1 str2" 表示str1和str2同时出现

  • mdfind "str1|str2" 表示str1和str2出现一个

  • mdfind "str1-str2 表示出现str1但不出现str2


`mdfind`更高级的用法,参考spotlight的metadata定义,参考spotlight。

spotlight定义的metadata不太好理解,不过敲一敲这个命令`mdls`就能知道个大概:

?  ~T  mdls ~/Movies/Practise.mp4
kMDItemAudioBitRate            = 48
kMDItemAudioChannelCount       = 2
kMDItemCodecs                  = (
    "H.264",
    AAC
)
kMDItemContentCreationDate     = 2012-01-05 21:59:18 +0000
kMDItemContentModificationDate = 2012-01-05 21:59:18 +0000
kMDItemContentType             = "public.mpeg-4"
kMDItemContentTypeTree         = (
    "public.mpeg-4",
    "public.movie",
    "public.audiovisual-content",
    "public.data",
    "public.item",
    "public.content"
)
.....
kMDItemFSName                  = "Practise.mp4"
......
?  ~T  mdfind ‘kMDItemCodecs=H.264‘ | grep ‘Practise‘
/Users/hong/Movies/Practise.mp4

spotlight里正是通过这些‘kMDItem‘开头的metadata来做索引的

命令行控可以再看看这个:“用命令行使用spotlight”