Linux locate命令:按照文件名搜索文件

whereis 和 which 命令都是只能搜索系统命令的命令,而 locate 命令才是可以按照文件名搜索普通文件的命令。

但是 locate 命令的局限也很明显,它只能按照文件名来搜索文件,而不能执行更复杂的搜索,比如按照权限、大小、修改时间等搜索文件。如果要按照复杂条件执行搜索,则只能求助于功能更加强大的 find 命令。locate 命令的优点鮮常明显,那就是搜索速度非常快,而且耗费系统资源非常小。这是因为 locate 命令不会直接搜索硬盘空间,而会先建立 locate 数据库,然后在数据库中按照文件名进行搜索,是快速的搜索命令。

locate 命令的基本信息如下。
  • 命令名称:locate。
  • 英文原意:find files by name。
  • 所在路径:/usr/bin/locate。
  • 执行权限:所有用户。
  • 功能描述:按照文件名搜索文件。

命令格式

locate 命令只能按照文件名来进行搜索,所以使用比较简单。

[root@localhost ~]# locate [选项] 文件名

选项:
  • -i:忽略大小写

常见用法

【例 1】基本用法。

搜索 Linux 的安装日志。

[root@localhost ~]# locate install.log
/root/install.log
/root/install.log.syslog
#搜索文件名叫install.log的文件

系统命令其实也是文件,也可以按照文件名来搜索系统命令。

[root@localhost ~]# locate mkdir
/bin/mkdir
/usr/bin/gnomevfs-mkdir
/usr/lib/perl5/auto/POSIX/mkdir.al
…省略部分内容...
#会搜索出所有含有mkdir字符串的文件名,当然也包含mkdir命令


【例 2】locate 命令的数据库。
我们在使用 locate 命令的时候,可能会发现一个问题:如果我们新建立一个文件,那么 locate 命令找不到这个文件。例如:

[root@localhost ~]# touch cangls
[root@localhost ~]# locate cangls
#新建立的文件,locate命令找不到

这是因为 locate 命令不会直接搜索硬盘空间,而会搜索 locate 数据库。这样做的好处是耗费系统资源小、搜索速度快;缺点是不是实时更新的,而要等用户退出登录或重启系统时,locate 数据库才会更新,所以我们无法查找到新建立的文件。

既然如此,locate 命令的数据库在哪里呢?

[root@localhost ~]#ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 2328027 6月 14 02:08/var/lib/ mlocate/mlocate.db
#这是 locate 命令实际搜索的数据库的位置

这个数据库是二进制文件,不能直接使用 Vim 等编辑器査看,而只能使用对应的 locate 命令进行搜索。如果我们不想退出登录或重启系统,则也可以通过 updatedb 命令来手工更新这个数据。例如:

[root@localhost ~]# locate cangls
#没有更新数据库时,找不到cangls文件
[root@localhost ~]# updatedb
#更新数据库[root@localhost ~]# locate cangls
/root/cangls
#新建立的文件已经可以搜索到了

locate配置文件

我们再做一个实验,看看这是什么原因导致的。

[root@localhost ~]# touch /tmp/lmls
#在/tmp/目录下新建立一个文件
[root@localhost ~]# updatedb
#更新locat数据库
[root@localhost ~]# locate lmls
#依然查询不到lmls这个新建文件

新建立了 /tmp/lmls 文件,而且也执行了 updatedb 命令,却依然无法找到这个文件,这是什么原因?这就要来看看 located 配置文件 /etc/updatedb.conf了。

[root@localhost ~]#vi /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
#开启搜索机制,也就是让这个配置文件生效
PRUNEFS = "9p afs anonjnodefs auto autofs bdev binfmt_misc cgroup cifs coda
configfs cpuset debugfs devpts ecryptfs exofe fuse fusectl gfs gfe2 hugetlbfs
inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfe nfs4 nfsd pipefe proc ramfs rootfs
rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
#在local执行搜索时,禁止搜索这些文件系统类型
PRUNENAMES = ".git.hg.svn"
#在locate执行搜索时,禁止搜索带有这些扩展名的文件
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spod/cups /var/spool/squid /var/tmp"
#在locat执行搜索时,禁止搜索这些系统目录

在 locate 执行搜索时,系统认为某些文件系统、某些文件类型和某些目录是没有搜索必要的,比如光盘、网盘、临时目录等,这些内容要么不在 Linux 系统中,是外来存储和网络存储,要么是系统的缓存和临时文件。刚好 /tmp/ 目录也在 locate 搜索的排除目录当中,所以在 /tmp/ 目录下新建的文件是无法被找到的。