概述
locate
命令主要是用来查找文件的,但它的速度比find
命令快很多。因为它不是按路径进行搜索的,而是去搜索一个数据库,即/var/lib/mlocate/mlocate.db
。这个数据库中含有本地所有文件信息,Linux系统自动创建这个数据库,并且每天自动更新一次。
但注意,我们在使用locate
命令搜索文件时可能搜索到已删除或者搜索不到新创建或上传的文件,这是因为数据库文件没有被更新。所以每次在执行locate
命令之前,都需要先执行updatedb
命令更新数据库文件,即使是在脚本中也需要先执行updatedb
命令更新数据库文件再执行locate
命令查找文件。
注意,locate
命令并不是在系统中一定会有的,可能会需要安装,执行locate -V
命令查看系统中是否安装有locate
命令。
如果提示-bash: locate: command not found
则请参考进行安装:-bash: mlocate: command not found
语法
locate
命令的基本语法如下:locate [选项] [参数]
。
常用选项如下:
选项 | 说明 |
---|---|
-b, --basename | 匹配唯一的路径名称的基本文件名 |
-c, --count | 显示匹配的文件个数,返回数字 |
-d, --database DBPATH | 用 DBPATH 替代默认的数据库(/var/lib/mlocate/mlocate.db ) |
-e, --existing | 只显示当前存在的文件条目 |
-L, --follow | 当文件存在时跟随蔓延的符号链接 (默认),会跟着软链接继续查找 |
-h, --help | 显示本帮助 |
-i, --ignore-case | 匹配模式时忽略大小写区别 |
-l, --limit, -n LIMIT | 限制为 LIMIT项目的输出 (或 计数),如-l 1 即使有多个匹配结果也只输出第一个 |
-m, --mmap | 忽略向后兼容性 |
-P, --nofollow, -H | 当检查文件时不跟随蔓延的符号链接,不会跟着软链接继续查找 |
-0, --null | 输出时以 NUL 分隔项目 |
-S, --statistics | 不搜索项目,显示有关每个已用数据库的统计信息,即显示目录数、文件数等 |
-q, --quiet | 不报告关于读取数据库的错误消息 |
-r, --regexp REGEXP | 搜索基本正则表达式 REGEXP 来代替模式,即使用正则表达式来匹配文件名 |
–regex REGEXP | 模式是扩展正则表达式 |
-s, --stdio | 忽略向后兼容性 |
-V, --version | 显示版本信息 |
-w, --wholename | 匹配完整路径名 (默认),即会显示匹配到的文件的绝对路径 |
参数为文件名或目录名。
使用
查找指定文件
# 查看名为restart.sh的文件
locate restart.sh
# /usr/local/qcloud/stargate/admin/restart.sh
查找指定目录下以某个字符串开头的文件
# 例如,查找`/root/.ssh`目录下以"id_rsa"开头的所有文件
locate /root/.ssh/id_rsa
# /root/.ssh/id_rsa
# /root/.ssh/id_rsa.pub
利用正则表达式查找指定模式的文件
# 使用-r选项查找以"sh"结尾的文件或目录
locate -r sh$
拓展延申
updatedb的配置文件/etc/updatedb.conf
/ect/updatedb.conf
是updatedb
命令的配置文件,配置了一些数据库更新信息,我们可以在该文件中配置需要排除检索的文件。
使用cat /etc/updatedb.conf
命令查看配置文件内容如下:
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
关于/etc/updatedb.conf
文件的说明如下:
选项 | 说明 |
---|---|
PRUNE_BIND_MOUNTS | 表示是否进行限制搜索 |
PRUNEFS | 指要排除的文件系统类型,即列出的文件类型不会被检索 |
PRUNENAMES | 指要对哪些后缀的文件排除检索,即列出的带有这些的文件不会被检索 |
PRUNEPATHS | 指要排除检索的路径,即列出路径下的文件和子文件夹都不会被检索,即使是updatedb 之后也无法找到 |
修改之后重新执行updatedb
命令更新数据库,再执行locate
命令进行查找。
find
命令和locate
命令的区别
locate
命令会通过数据库进行查找文件,速度非常快;而find
命令则是直接在硬盘上查找文件,查找速度非常慢。locate
命令查找的文件是基于数据库的,如果是已删除或者新增加的文件,未被数据库记录那么可能查找到错误结果或者未查找到导致结果不准确;而find
命令则查找很精确,不会出现locate
命令出现的问题。locate
命令执行应该执行updatedb
命令更新数据库;而find
命令不需要多执行一个命令。