9.1 搜索文件名数据库
locate
知道文件的名称,或者名称的一部分,但不记得放在系统的哪个位置。这就是locate
命令要解决的问题。locate
命令能够在文件、程序和目录中查找与提供的搜索项匹配的内容,并把任何匹配的结果依次显示到终端界面上。
说明 为了节省篇幅,此处用省略号代替路径的前面一部分
-/home/ scott -
。
$ locate haggard
.../txt/rider_haggard
.../txt/rider_haggard/Queen_of_the_Dawn.txt
.../txt/rider_haggard/Allan_and_the_Ice-Gods.txt
.../txt/rider_haggard/Heu-Heu_or_The_Monster.txt
搜索结果出来得非常快,因为locate
命令并没有对系统进行实时搜索。实际上,它搜索的是每天自动更新的文件名数据库(请参照9.4节了解更多内容)。因为locate
搜索的是早已创建好的数据库,所以搜索结果几乎能够瞬间显示出来。
不过,在你的计算机上使用的可能不是locate
命令,而是slocate
命令,只是你没有意识到而已。slocate
(代表secure locate)命令的版本更新些,它不会搜索运行slocate
命令的用户没有权限查看的目录(例如,如果你不是root用户,那么当用locate
搜索时,就不会显示/root
目录中的结果)。在slocate
问世之前,locate
经常反馈很多错误,抱怨权限问题;而有了slocate
以后,这些错误就不复存在了。
要体验一下slocate
是如何运行的,可以尝试以下命令。注意,第一次搜索是以普通用户的身份执行的,而不是root用户,搜索将失败。使用su
命令成为root用户,再次运行locate
命令,这次就成功了。搜索结果如下所示(顺便说一下,slocate.db
是slocate
命令使用的数据库文件)。
$ locate slocate.db
$ su -
# locate slocate.db
/var/lib/slocate/slocate.db.tmp
/var/lib/slocate/slocate.db
不过,为了简化用户的操作,大多数系统都为/usr/bin/locate
创建了一个软链接,让它指向/usr/bin/slocate
。要验证一下你的Linux分发版是否也是这样的,可以试试以下命令(这里显示的特定结果来自一台运行K/Ubuntu 5.10的计算机,这是一种基于Debian的Linux分发版,删除了一些数据,以便突出重要的信息):
$ ls -l /usr/bin/locate
root root /usr/bin/locate -> slocate
因为运行slocate
对用户来说是透明的(也就是说,用户看不到他运行的是slocate
),而且locate
使用的字母更少一些,输入得更快,所以本书也继续使用locate
,虽然实际运行的命令是slocate
。