Unix的locate命令为何仍会显示已经不存在的文件/文件夹?

10

我最近将我的本地web开发环境从Mac上的MAMP迁移到MacPorts,因为我开始接触Python/Django,所以不再需要MAMP。

问题是,我已经从应用程序文件夹中卸载了MAMP,并删除了首选项文件,但是当我在终端中运行“locate MAMP”命令时,它仍然显示所有位于/Applications/MAMP/的文件,就好像它们仍然存在一样。而当我使用“cd”进入/Applications/MAMP/时,它并不存在。

这是否与locate是一种索引搜索系统有关?因此旧的文件路径被缓存了?请解释为什么以及如何解决这个问题,以便它们不再显示。

5个回答

9
你的想法是正确的: locate 使用一个叫做“locatedb”的数据库。这个数据库通常由系统 cron 作业更新(在 OS X 上不确定是哪个);你可以使用 updatedb 命令强制更新。参见 http://linux-sxs.org/utilities/updatedb.html 和其他来源。
此外,如果你没有找到你期望的文件,请注意 OSX 的 locate(1) 手册中 BUGS 部分的重要警告: locate 数据库通常是由用户“nobody”构建的,并且 locate.updatedb(8) 实用程序会跳过对于用户“nobody”、组“nobody”或全局不可读的目录。例如,如果你的 HOME 目录不可读,则你的文件都不在数据库中。

由于同样的原因,locate无法显示最近创建的文件 - 自上次updatedb以来创建的任何文件都不会被locate看到。 - Carl Manaster
在OSX 10.10上,更新数据库的系统cron是/System/Library/LaunchDaemons/com.apple.locate.plist - Ashutosh Jindal
此外,如果您没有找到预期的文件,请注意来自OSX [locate(1)](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/locate.1.html)手册中BUGS部分的重要警告:`locate数据库通常由用户“nobody”构建,locate.updatedb(8)实用程序跳过不可读取的目录,对于用户“nobody”,组“nobody”或全局而言。例如,如果您的HOME目录不可读取,则数据库中没有任何文件。` - Ashutosh Jindal
最终解决方法是首先使用sudo运行updatedb命令。我猜测某些索引运行的位置需要root权限。 - ErezBerez

6

其他回答中提到需要更新locate数据库是正确的。我有一个别名可以更新我的locate数据库:

alias update_locate='sudo /usr/libexec/locate.updatedb'

现在我已经找到了mdfind,所以实际上我不再经常使用locate。 它使用 spotlight 文件索引,与locatedb相比,OSX更擅长保持最新状态。 从命令行中搜索的能力也更强大。


0
根据手册,它的数据库每周更新一次:
NAME
     locate.updatedb -- update locate database

SYNOPSIS
     /usr/libexec/locate.updatedb

DESCRIPTION
     The locate.updatedb utility updates the database used by locate(1).  It is typically run once a week by
     the /etc/periodic/weekly/310.locate script.

0

实际上,locate 命令通过索引进行搜索,因此速度相当快。索引是由 updatedb 命令生成的,通常作为每晚或每周的任务运行。

因此,要手动更新它,只需运行 updatedb 命令。


0

请查看locate手册页面

http://unixhelp.ed.ac.uk/CGI/man-cgi?locate+1

你会发现 locate 搜索的是一个数据库,而不是你实际的文件系统。 你可以使用 updatedb 命令来更新该数据库。

另外,由于它是一个数据库,除非你定期更新它,否则 locate 将无法找到在你的文件系统中但不在数据库中的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接