locate命令是Linux上一个强大的文件查找工具,用于根据文件名快速查找文件和目录。它利用一个预先构建的数据库(通常由updatedb命令定期更新)来执行快速搜索,使其比find等其他搜索工具快得多。当用户输入locate命令后跟搜索模式时,它会扫描该数据库而非文件系统本身,几乎可以立即返回结果。这使得locate特别适合系统管理员和用户在不需要对文件系统进行实时扫描的情况下快速定位文件。但请注意,locate的准确性取决于数据库的更新频率,因为在下次更新之前,它可能不会反映文件系统的最新变化。

本教程将通过简单易懂的示例详细解释llocate命令的用法。注意,本教程中的所有指令和示例均在Ubuntu 24.04上进行了测试。

1. 安装locate命令

在Ubuntu和Debian Linux上,locate命令并不是预装的。你可以使用以下命令进行安装:

sudo apt install locate

locate基于一个预编译的文件名数据库来搜索文件,这使得它在后续搜索中比例如find命令快得多。但在使用之前,我们需要先创建并更新文件数据库。运行以下命令来创建locate数据库:

sudo updatedb

现在我们就可以开始使用locate了。

find与locate对比:数据库更新前后搜索结果

2. 如何在Linux中使用locate命令

locate命令非常简单易用。你只需要传入想要搜索的文件名即可:

locate [filename]

例如,如果想搜索所有包含“dir2”字符串的文件名,可以使用以下方式:

locate dir2

locate dir2搜索结果

注意:“locate dir2”(不带通配符)也可以正常工作,因为locate会隐式地将传入的名称(比如NAME)替换为*NAME*。

3. locate命令的工作原理(为什么这么快)

locate之所以如此快速,是因为它不会读取文件系统来查找文件或目录名称。它参考一个数据库(由updatedb命令准备)来查找用户所需的内容,并根据搜索结果生成输出。

虽然这是一个很好的方法,但它也有一些缺点。主要问题是,每次在系统上创建新的文件或目录后,你需要更新工具的数据库才能正确工作。否则,该命令将无法找到在上次数据库更新后创建的文件/目录。

例如,如果我尝试在系统的Downloads目录中查找包含“tosearch”字符串的文件,find命令会在输出中显示一个结果,但当我使用locate命令执行同样的搜索时,它不会产生任何输出。这意味着locate搜索的数据库在文件创建后没有更新。所以,让我们更新数据库,可以使用updatedb命令完成:

sudo updatedb

现在再次运行相同的locate命令,它将会在输出中显示文件。同样,在文件或目录被删除后,你需要确保locate数据库已更新,否则命令在搜索时仍会显示该文件。

4. 让locate输出匹配条目的数量

如我们所见,locate命令会输出匹配文件的名称及其完整的绝对路径。但如果你需要,可以让工具将这些信息全部隐藏,只显示匹配条目的数量或计数。这可以通过-c命令行选项实现。例如:

locate -c dir2

locate -c显示匹配条目数量

5. 只显示当前存在的文件

如果一个文件从系统中删除了,但你没有更新locate数据库,命令仍会在输出中显示该文件名。对于这种情况,你可以跳过更新数据库的步骤,使用-e命令行选项让locate只显示当前存在的文件。

例如,假设我从系统中删除了“filetosearch.txt”文件。find命令已经确认无法再找到该文件,但locate仍然在输出中显示它——这是因为locate的数据库在文件删除后没有更新。然而,使用-e选项可以解决这个问题:

locate -e filetosearch

locate -e只显示当前存在的文件

locate手册页关于这个选项的说明是:“只输出在locate运行时存在的文件条目”。

6. 忽略大小写区别

默认情况下,locate命令的搜索操作是区分大小写的。但你可以使用-i命令行选项让工具忽略大小写区别。

例如,假设系统上有两个文件:“newfiletosearch.txt”和“NEWFILETOSEARCH.txt”。如果使用locate搜索“*tosearch*”,只会显示小写的文件名:

locate *tosearch*

但使用-i命令行选项会强制命令忽略大小写,两个文件名都会显示在输出中:

locate -i *tosearch*

locate -i忽略大小写搜索结果

7. 使用ASCII NUL分隔输出条目

默认情况下,locate命令的输出条目使用换行符(\n)分隔。但如果需要,你可以更改分隔符,将其替换为ASCII NUL。这可以通过-0命令行选项实现。例如:

locate -i -0 *tosearch*

locate -0使用NUL分隔符输出

这样换行分隔符就不再存在了,它已被替换为NUL字符。

8. 查看locate数据库信息

如果你想知道locate正在使用哪个数据库,以及数据库的其他统计信息,可以使用-S命令行选项:

locate -S

locate -S显示数据库统计信息

执行后会显示数据库路径、数据库中的文件数量以及数据库大小等统计信息。

9. 使用正则表达式精确搜索文件名

默认情况下,使用locate搜索文件名时,传入的名称(比如NAME)会被隐式地替换为*NAME*。例如,如果搜索文件名“testfile”,则所有匹配*testfile*的名称都会显示在输出中。

但如果要求搜索与“testfile”完全匹配的文件名呢?在这种情况下,你需要使用正则表达式,可以通过-r命令行选项启用。以下是使用正则表达式搜索“testfile”的方法:

locate -r /testfile$

locate -r正则表达式精确匹配文件名

如果你对正则表达式不熟悉,可以参考这里的教程。

总结

locate提供了更多的选项,但我们在这里讨论的内容已经足够让你对这个命令行工具有一个基本的了解,并开始使用它。我们建议你在Linux机器上尝试这里介绍的所有选项,然后再参考工具的man页面了解更多功能。