Linux locate ( locate ) 命令用于按照文件或目录的名称快捷、简单的在系统中查找、搜索文件或目录。

locate 命令的定义解释

locate ( locate ) 命令用于按照文件或目录的名称快捷、简单的在系统中查找、搜索文件或目录。在 Linux 和 FreeBSD 系统上有几个用于查找、搜索文件和目录的命令工具,其中 findlocate 是最常用的命令。而 locate 命令是按文件名搜索文件和目录最快捷、最简单的方法。

locate 命令使用 updatedb 命令生成的数据库文件搜索给定的模式,搜索到的结果每行显示一个。

可以安装 mlocate 包,它会创建一个 cron 任务,每 24 小时运行一次 updatedb 命令。这样可以确保数据库定期更新。以 root 用户或具有 sudo 权限的用户运行 updatedb,可以手动更新数据库。

更新过程将花费一些时间,具体取决于文件和目录的数量以及系统的速度。数据库更新后再创建的文件不会出现在数据库中,所以是无法搜索到的。

与搜索文件功能更强大的 find 命令相比,locate 搜索文件快得多,但缺乏许多功能,它只能通过文件名进行搜索。

安装 locate 命令

默认情况下在很多系统中没有安装 locate 命令的,可以在命令行输出 locate 查看输入信息

locate

如果显示以下信息,则说明没有安装 locate 命令:

bash: locate: 未找到命令

那么就需要安装 locate:

可选安装 mlocate,用于创建 cron 任务,自动运行 updatedb 命令,更新数据库,也可以手动创建 cron 任务更新数据库。

1、Debian、Ubuntu 安装 locate:

sudo apt update
sudo apt install locate

2、RHEL、AlmaLinux、Rocky Linux 安装 locate:

sudo dnf update
sudo dnf install locate

3、FreeBSD 安装 locate:

sudo pkg update
sudo pkg install locate

4、Arch Linux 安装 locate:

sudo pacman -Sy
sudo pacman -S locate

更新数据库

在安装 locate 命令后要运行 updatedb 命令更新数据库,才能搜索文件。

1、手动更新数据库

sudo updatedb

2、创建 cron 任务每 24 小时更新一次数据库(需要编辑超级用户的 cron 文件):

sudo crontab -e

添加如下内容:

# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# m  h   dom  mon  dow   command
   0   0   *        *       *        updatedb

注释内容无需添加,在这里给出是为了好让你明白各字段意思。

locate 命令语法

locate [OPTION] PATTERN...
  • [OPTION]:选项,可选
  • [PATTERN]:文件名模式字符串,可以是精确的字符,也可以使用正则表达式

locate 命令使用示例

使用文件名精确匹配

查找名称为 ”.bashrc“ 的文件:

locate .bashrc

输出信息:

/etc/bash.bashrc
/etc/skel/.bashrc
/home/u1sz/.bashrc
/root/.bashrc
/usr/share/base-files/dot.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/bash.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/skel/dot.bashrc

使用正则表达式匹配文件名

使用通配符 * 匹配文件名:

locate *.md

限制输出结果的数量

使用 -l 2 限制只输出两条结果:

locate -l 2 .bashrc

输出信息:

/etc/bash.bashrc
/etc/skel/.bashrc

输出匹配文件的数量

使用 -c (--count) 选项输出匹配文件的数量,而不列出匹配文件的名称:

locate -c .bashrc

输出信息:

7

忽略文件名大小写

使用 -i (--ignore-case) 选项,在匹配文件名时,忽略字符的大小写:

locate -i FILE1.txt

locate 命令选项解释

如下给出了 Linux locate 命令中所有选项的解释说明:

选项 解释说明
-0, --null 使用 ASCII 码 NUL作为分隔符,而不是换行符
-A, --all 只输出匹配所有非选项参数的名称,不输出匹配一个或多个非选项参数的名称
-b, --basename 如果指定的模式与数据库中列出的文件名的最后部分匹配,则认为匹配成功。最后部分通常被称为“基本名称”
-c, --count 不输出匹配的文件名,只输出匹配到的文件的总数量,除非同时使用 --print (-p) 选项
-d path, --database=path 不搜索默认的文件名数据库,而是在 path 中指定的数据库中搜索文件,path 是一个以冒号分隔的数据库文件名列表;还可以使用环境变量 LOCATE_PATH 设置要搜索的数据库文件列表。如果两者都使用,则该选项将覆盖环境变量。路径中的空元素被视为默认数据库文件名的同义词。使用 - 作为 path,则从标准输入读取提供的数据库文件名。
-e, --existing 只输出当前存在的名称(而不是创建数据库时存在的名称);注意,如果数据库中有很多匹配项,这可能会大大降低程序的速度
-E, --non-existing 只打印当前不存在的名称(而不是创建数据库时存在的名称)。注意,如果数据库中有很多匹配项,这可能会大大降低程序的速度。
--help 显示帮助信息后退出
-i, --ignore-case 忽略模式和文件名中的大小写区别
-l N, --limit=N 将匹配的数量限制为 N。如果通过此选项设置了限制,则为 -c 选项输出的结果数量将永远不会大于此数字。
-L, --follow 如果测试文件是否存在(使用 -e-E 选项),则认为断开的符号链接不存在。这是默认值。
--max-database-age D 通常,locate 在搜索超过 8 天的数据库时会发出警告消息。此选项将该值更改为 8 以外的值。指定负值的效果未定义。
-m, --mmap 为了与 BSD locate 兼容,接受该选项但不起任何作用
-P, -H, --nofollow 如果测试文件是否存在(使用 -e-E 选项),则将断开的符号链接视为存在的文件。该选项的 -H 形式纯粹是为了与 find 相似而提供的;建议使用 -P而不是 -H
-p, --print 由于存在 --statistics (-S)--count (-c),通常不会输出搜索结果。使用该选项强制输出结果
-r, --regex 指定的模式为正则表达式,而不是 glob 模式。正则表达式的工作方式与 emacs 相同,但在这里 . 不匹配换行符
--regextype R 使用正则表达式方言 R。支持的方言包括 'findutils-default', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'awk', 'ed', 'egrep', 'emacs', 'gnu-awk', 'grep' 和 'sed'。有关这些方言的详细解释,请参阅Texinfo 文档。
-s, --stdio 为了与 BSD locate 兼容,接受该选项但不起任何作用
-S, --statistics 输出关于每个 locate 数据库的各种统计信息,然后退出(不执行搜索,除非给出了非选项参数)。为了与 BSD 兼容,-S 作为 --statistics 的同义词。然而,locate -S 的输出对于 locate 的 GNU 和 BSD 实现是不同的。
-v, --version 显示版本信息后退出
-w, --wholename 与数据库中列出的文件的全名进行匹配。这是默认值。

结语

在本教程中我们介绍了如何使用 locate ( locate ) 命令按照文件或目录的名称快捷、简单的在系统中查找、搜索文件或目录。在 Linux 和 FreeBSD 系统上有几个用于查找、搜索文件和目录的命令工具,其中 findlocate 是最常用的命令。而 locate 命令是按文件名搜索文件和目录最快捷、最简单的方法。

该 locate 命令可以在 Linux 系统中使用,也可以在 FreeBSD 系统中使用。