Linux命令之查找文件locate

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令之查找文件locate相关的知识,希望对你有一定的参考价值。

概述

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.confupdatedb命令的配置文件,配置了一些数据库更新信息,我们可以在该文件中配置需要排除检索的文件。

使用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命令不需要多执行一个命令。

以上是关于Linux命令之查找文件locate的主要内容,如果未能解决你的问题,请参考以下文章

linux之查找命令find,locate

Linux文件查找之find&locate

Linux文件查找命令之locate与find

Linux之locate命令

Linux命令之查找可执行文件或源代码文件或帮助文件whereis

Linux文件查找工具之find “大宝剑”