locate(1)
locate — 快速查找文件名
名称
locate
概要
locate [-0Scims] [-l limit] [-d database] pattern ...
描述
locate 程序在数据库中搜索所有与指定 pattern 匹配的路径名。数据库会定期重新计算(通常每周或每天一次),其中包含所有可公开访问的文件的路径名。
Shell globbing 和 quoting 字符("*"、"?"、"\"、"[" 和 "]")可在 pattern 中使用,但需要对 shell 进行转义。在任何字符前加反斜杠("\")可消除其可能具有的特殊含义。匹配的不同之处在于,无需显式匹配任何字符,包括斜杠("/")。
作为一种特殊情况,不包含 globbing 字符的模式("foo")会按照 "*foo*" 的方式进行匹配。
历史上,locate 仅存储 32 到 127 之间的字符。当前的实现存储除换行符('\n')和 NUL('\0')之外的任何字符。8 位字符支持不会为纯 ASCII 文件名浪费额外空间。小于 32 或大于 127 的字符以 2 字节存储。
可用选项如下:
-0 以 ASCII NUL 字符(字符代码 0)分隔打印路径名,而非默认的 NL(换行符,字符代码 10)。
-S 打印有关数据库的一些统计信息并退出。
-c 抑制正常输出;改为打印匹配的文件名计数。
-d database 在 database 中搜索,而非使用默认的文件名数据库。允许指定多个 -d 选项。每个额外的 -d 选项将指定的数据库添加到要搜索的数据库列表中。database 选项可以是用冒号分隔的数据库列表。单个冒号表示引用默认数据库。
将首先在 $HOME/lib/mydb 中搜索字符串 "foo",然后在 /var/db/locate.database 中搜索。
将首先在 $HOME/lib/mydb 中搜索字符串 "foo",然后在 /var/db/locate.database 中搜索,最后在 /cdrom/locate.database 中搜索。
等同于
或
如果将 - 作为数据库名称给出,则改为读取标准输入。例如,你可以压缩数据库并使用:
这在 CPU 速度快、内存少且 I/O 慢的机器上可能有用。注意:标准输入只能使用一个 pattern。
-i 在模式和数据库中忽略大小写差异。
-l number 将输出限制为 number 个文件名并退出。
-m 使用 mmap(2) 而非 stdio(3) 库。这是默认行为,在大多数情况下更快。
环境变量
LOCATE_PATH locate 数据库的路径(若已设置且非空);若指定了 -d 选项则忽略。
文件
/var/db/locate.database locate 数据库
/usr/libexec/locate.updatedb 更新 locate 数据库的脚本
/etc/periodic/weekly/310.locate 启动数据库重建的脚本
参见
find(1), whereis(1), which(1), fnmatch(3), locate.updatedb(8)
Woods, James A., "Finding Files Fast", ;login, 8:1, pp. pp. 8-10, 1983.
历史
locate 命令首次出现于 4.4BSD。许多新特性在 FreeBSD 2.2 中加入。
缺陷
locate 程序可能无法列出某些存在的文件,或者可能列出已从系统中移除的文件。这是因为 locate 仅报告数据库中存在的文件,而数据库通常仅由 /etc/periodic/weekly/310.locate 脚本每周重新生成一次。使用 find(1) 来查找更具临时性的文件。
locate 数据库通常由用户 "nobody" 构建,而 locate.updatedb(8) 实用程序会跳过对用户 "nobody"、组 "nobody" 或所有用户不可读的目录。例如,如果你的 HOME 目录不是对所有用户可读,则你的文件一个也不会出现在数据库中。
locate 数据库不独立于字节序。无法在不同字节序的机器之间共享数据库。当前的 locate 实现可以理解主机字节序或网络字节序的数据库,前提是两种架构使用相同的整数大小。因此,在 FreeBSD/i386 机器(小端序)上,你可以读取在 SunOS/sparc 机器(大端序,网络字节序)上构建的 locate 数据库。
locate 实用程序不识别多字节字符。
最后更新于
这有帮助吗?