前言
locate命令主要用于查找文件或目录,来源于mlocate包。
一、locate
locate查找文件或目录,不是去搜索具体的目录,而是去检索一个/var/lib/mlocate/mlocate.db
数据库文件。该文件包含本地所有文件信息,系统每天会自动更新该数据库文件一次。
安装:
yum install -y mlocate
整个locate由四部分组成:
- /usr/bin/updatedb 更新数据库,每日自动由crontab完成,亦可手动触发更新
- /usr/bin/locate 命令执行文件,查询文件位置
- /etc/updatedb.conf updatedb的配置文件
- /var/lib/mlocate/mlocate.db 存放文件信息的数据库文件
locate使用:
[root@localhost ~]# locate --help
Usage: locate [OPTION]... [PATTERN]...
Search for entries in a mlocate database.
-A, --all only print entries that match all patterns
-b, --basename match only the base name of path names
-c, --count only print number of found entries
-d, --database DBPATH use DBPATH instead of default database (which is
/var/lib/mlocate/mlocate.db)
-e, --existing only print entries for currently existing files
-L, --follow follow trailing symbolic links when checking file
existence (default)
-h, --help print this help
-i, --ignore-case ignore case distinctions when matching patterns
-l, --limit, -n LIMIT limit output (or counting) to LIMIT entries
-m, --mmap ignored, for backward compatibility
-P, --nofollow, -H don't follow trailing symbolic links when checking file
existence
-0, --null separate entries with NUL on output
-S, --statistics don't search for entries, print statistics about each
used database
-q, --quiet report no error messages about reading databases
-r, --regexp REGEXP search for basic regexp REGEXP instead of patterns
--regex patterns are extended regexps
-s, --stdio ignored, for backward compatibility
-V, --version print version information
-w, --wholename match whole path name (default)
[root@localhost ~]# updatedb
[root@localhost ~]# locate 新建文本文档.txt
/root/新建文本文档.txt
[root@localhost ~]#
二、updatedb
系统每日会更新一次mlocate.db
文件,其更新操作由crond+updatedb组合完成:
[root@localhost ~]# cat /etc/cron.daily/mlocate
#!/bin/sh
nodevs=$(awk '$1 == "nodev" && $2 != "rootfs" && $2 != "zfs" { print $2 }' < /proc/filesystems)
renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
有时在通过locate查找文件时,会找到已经被删除的文件(不久前删除),或者是刚刚创建的文件未找到,这是因为数据库文件尚未被系统更新,此时该文件中就还保留有已删除的文件信息或尚未包含新建的文件信息。那么就需要手动去更新数据库。
[root@localhost ~]# locate ana # 搜索名称或路径中包含“ana”的文件
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
# 更新或创建数据库文件
[root@localhost ~]# updatedb # 更新索引
# 数据库文件更新完毕,进行查找文件,即可定位文件所在路径
[root@localhost ~]# locate ana
/etc/NetworkManager
/etc/anacrontab
/etc/NetworkManager/NetworkManager.conf
/etc/NetworkManager/conf.d
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dnsmasq-shared.d
三、updatedb.conf
有时我们需要调整updatedb的一些策略,比如mlocate.db数据库文件过大,此时就需要在配置文件中配置忽略掉一些文件或目录,以减小db文件。
[root@localhost ~]# vi /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" # 排除检索特定路径下的目录及文件
~
可以在PRUNEPATHS
添加上需要排除检索的路径,以达到减小数据库文件大小的目的。
之后手动更新一次updatedb
即可。