「locate(1)」-

根据名字来查找文件

命令语法格式

locate [OPTION]… PATTERN…

命令描述

命令locate读取由updatedb(8)创建的一个或多个数据库,并将与至少匹配一个PATTERN的文件名写入标准输出,每行一个。

如果未指定–regex,则PATTERN可以包含通配符。如果任何“PATTERN”中不包含通配符,则等同于指定了“*PATTERN*”一样。

默认情况下,命令locate不会检查数据库中找到的文件是否仍然存在(但如果使用updatedb(8)的“–require-visibility no”构建数据库,则确实需要所有父目录是存在的)。

命令locate永远不会输出在最近更新相关数据库之后创建的文件,因为这些文件还没有索引到数据库。

命令支持的选项及含义

-c, –count
在标准输出上,仅输出匹配条目的数量,而不是输出文件名。

-d, –database DBPATH
用DBPATH替换默认数据库。参数DBPATH是一个以冒号(:)分隔的数据库文件名列表。如果指定了多个–database选项,则生成的路径是单独路径的串联。

空数据库文件名由缺省数据库替换。如果数据库文件名为”-“表示标准输入。请注意,只能从标准输入读取一次数据库。

-e, –existing
仅打印执行locate时存在的文件的条目。

-L, –follow
检查文件是否存在时(即指定了–existing选项),对符号链接指向的文件进行查找。这会导致从输出中省略损坏的符号链接。

这是默认的行为。选项–nofollow与此相反。

-P, –nofollow, -H
检查文件是否存在时(即指定了–existing选项),只是检查符号链接是否存在,而不是符号链接指向的文件是否存在。因此符号链接损坏,也会像其他文件一样打印出来。

这与–follow相反。

-l, –limit, -n LIMIT
找到LIMIT条目后成功退出。 如果指定了–count选项,则结果计数也是限于LIMIT条。

-0, –null
使用NUL字符分隔输出中的条目,而不是每个条目在单独的行上。此选项旨在与GNU的xargs(1)的–null选项进行互操作。

-S, –statistics
将有关每个读取的数据库的统计信息写入标准输出,而不是搜索文件并成功退出。

-q, –quiet
不要输出有关读取和处理数据库时遇到的错误消息。

控制匹配行为

-A, –all
仅打印与所有PATTERN匹配的条目,而不是仅要求其中一个匹配。

-r, –regexp REGEXP
搜索是使用基本正则表达式REGEXP。如果使用此选项,则不允许使用PATTERN参数,但可以多次指定此选项。

–regex
将所有的PATTERN视为扩展正则表达式。

-i, –ignore-case
匹配是忽略大小写。

-b, –basename
仅将基本名称(basename)与指定的模式匹配。这与–wholename相反。

-w, –wholename
整个路径名称与指定模式匹配的。这是默认行为。这与–basename相反。

其他选项

–help
显示帮助信息并退出。

–version
显示版本信息并退出。

-s, –stdio
该选项已经忽略,用于兼容BSD和GNU的locate实现。

-m, –mmap
该选项已经忽略,用于兼容BSD和GNU的locate实现。

注意事项

未指定处理请求的数据库的顺序,这允许locate出于安全原因重新排序数据库路径。

命令locate尝试与slocate和GNU locate兼容(没有用于创建数据库的选项),按此顺序进行尝试。这就是不切实际的默认–follow选项以及令人困惑的–regex和–regexp选项集的原因。

短选项-r与GNU的locate不兼容,它对应于–regex选项。使用长选项名称可以避免混淆。

在BSD和GNU的locate中,环境变量LOCATE_PATH用于替换默认数据库。但在该实现和slocate中,它被添加到其他数据库中。

相关环境变量

LOCATE_PATH
其他数据库的路径,添加在默认数据库或使用–database选项指定的数据库之后。

相关文件

/var/lib/mlocate/mlocate.db
默认数据库搜索路径。

退出状态

如果找到任何匹配条目,或者使用–limit 0、–help、–statistic、–version选项之一调用locate命令,则locate以状态为“0”退出。如果未找到匹配项,或遇到致命错误,则locate以状态为“1”退出。

读取数据库时,遇到的错误并不是致命错误,则会在指定的其他数据库(如果有)中继续搜索。

使用示例

要搜索名为“NAME”(不是“*NAME*”)的文件,请使用:

# locate -b ‘\NAME’

因为“\”是一个通配符,所以这会禁用“*NAME*”隐式替换“NAME”,只有要通配符就不会把没有“通配符的NAME”替换成”*NAME*“(这是locate的一个默认行为,前面提到过)。

相关手册

updatedb(8)

参考文献

  • man 1 locate, Version mlocate 0.26

更新日志

  • 08/06/2018 创建文章