9.1 搜索文件名数据库

locate

知道文件的名称,或者名称的一部分,但不记得放在系统的哪个位置。这就是locate命令要解决的问题。locate命令能够在文件、程序和目录中查找与提供的搜索项匹配的内容,并把任何匹配的结果依次显示到终端界面上。

说明 为了节省篇幅,此处用省略号代替路径的前面一部分-/home/ scott -

  1. $ locate haggard
  2. .../txt/rider_haggard
  3. .../txt/rider_haggard/Queen_of_the_Dawn.txt
  4. .../txt/rider_haggard/Allan_and_the_Ice-Gods.txt
  5. .../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.dbslocate命令使用的数据库文件)。

  1. $ locate slocate.db
  2. $ su -
  3. # locate slocate.db
  4. /var/lib/slocate/slocate.db.tmp
  5. /var/lib/slocate/slocate.db

不过,为了简化用户的操作,大多数系统都为/usr/bin/locate创建了一个软链接,让它指向/usr/bin/slocate。要验证一下你的Linux分发版是否也是这样的,可以试试以下命令(这里显示的特定结果来自一台运行K/Ubuntu 5.10的计算机,这是一种基于Debian的Linux分发版,删除了一些数据,以便突出重要的信息):

  1. $ ls -l /usr/bin/locate
  2. root root /usr/bin/locate -> slocate

因为运行slocate对用户来说是透明的(也就是说,用户看不到他运行的是slocate),而且locate使用的字母更少一些,输入得更快,所以本书也继续使用locate,虽然实际运行的命令是slocate