Update on 2016-02-14: Now I just use spotlight builtin indexing: alias l=' mdfind -name', and the crontab entry could be removed.

以前在Linux下,我用locate找个人的文件,现在在Mac下,Alfred找文件始终有些不太习惯,于是又开始折腾。

首先Mac下有locate命令的,接受参数与Linux下的基本一样。可是,建立locate的数据库 文件的命令不是updatedb,而是/usr/libexec/locate.updatedb。直接执行这个,报错

sh-3.2# /usr/libexec/locate.upda'db
mktemp: too few X's in template ‘updatedb’
chown: missing operand after ‘nobody’
Try 'chown --help' for more information.
/usr/libexec/locate.updatedb: line 97: /var/db/locate.database: Permission denied
rm: missing operand
Try 'rm --help' for more information.

Google了一把,有日本友人也发现了这个问题,原因是我装了GNU的coreutils,而 locate.updatedb脚本要用到苹果自带的mktemp,命令行格式不一样报错。

解决方法不难,首先

cp /usr/libexec/locate.updatedb ~/bin/updatedb

然后打开~/bin/updatedb,把所有调用mktemp的地方改成/usr/bin/mktemp

然后就是在cron里面加点东西了

# 只搜索我的私人文件,数据库文件放自己的目录,一个小时运行一次
# cron配置最开始有设定 SHELL=/bin/zsh
5   *   *   *   *   SEARCHPATHS=$HOME FCODES=$HOME/.locate.db ~/bin/updatedb

再然后就是设定一个alias来使用locate了,我是写~/.zshrc

# 忽略大小写,指定数据库文件,不存命令记录(需要hist_ignore_space)
alias l=' locate -i -d ~/.locate.db'

这样以后找个文档就可以用l abc.pdf轻松找到咯。

我也试过装findutils,用他们的updatedb和mlocate,但是findutils里的updatedb脚本也有依赖GNU版本sort的问题, 而且安装findutils会让homebrew出现一些类似的状况,所以用Mac的朋友还是用自带的locate好了。