文章目录
- 一、命令介绍
- 二、相关文件说明
- 配置文件 updatedb.conf
- 三、更新数据库
- 四、常用选项
- 五、命令示例
- 搜索文件名以指定字符串开头的文件
- 查找名称中含有指定字符串的文件
- 使用正则表达式查找特定条件的文件
一、命令介绍
locate
命令用来查找文件或目录。 locate
命令要比 find -name
快得多,原因在于它不会深入到文件系统中去搜索具体目录,而是搜索一个索引数据库 /var/lib/mlocate/mlocate.db
。这个数据库存放着系统中的所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用 whereis
和 locate
查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用 locate
之前,先使用 updatedb
命令,手动更新数据库。
locate
可以指定具体名称、通配符、正则表达式来查找符合范本样式的文件和目录。
二、相关文件说明
文件 | 说明 |
---|---|
/usr/bin/updatedb | 主要用来更新数据库,默认每天执行一次,通过 crontab 自动完成的,该程序会开启一个名为 crond 的守护进程 |
/etc/crontab | crontab 的配置文件,可以设置程序 updatedb 的执行周期等 |
/etc/updatedb.conf | updatedb 的配置文件 |
/usr/bin/locate | 命令文件的位置 |
/var/lib/mlocate/mlocate.db | 存放文件信息的数据库文件。版本不同,文件名和位置会有所不同,有的版本是 /var/lib/locatedb ,有的版本是 /var/lib/slocate/slocate.db |
配置文件 updatedb.conf
[root@htlwk0001host ~]# 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 ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn .bzr .arch-ids {arch} CVS"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/lib/dnf/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
注:
PRUNE_BIND_MOUNTS
设置是否限制搜索,yes
表示限制搜索,no
表示不限制搜索;PRUNEFS
指定排除检索的文件系统类型,即列出的文件系统类型不进行检索;PRUNENAMES
指定排除检索的文件后缀名,即哪些后缀的文件不进行检索;PRUNEPATHS
指定排除检索的路径,即列出的路径下的文件及子目录均不会进行检索,所以 updatedb 之后使用 locate 仍然找不到明明存在的文件,可以在这里检查下是不是被排除在外了
三、更新数据库
[root@htlwk0001host ~]# updatedb
四、常用选项
选项 | 说明 |
---|---|
-b 或 --basename | 仅匹配路径名的基本名称 |
-c 或 --count | 只输出找到的条目数量 |
-d 或 --database <DBPATH> | 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db |
-e 或 --existing | 仅打印 locate 运行时存在的文件的条目,仅打印当前现有文件的条目 |
-L 或 --follow | 检查文件是否存在时,会跟踪符号链接,也就是说不把符号链接当成独立的文件进行检查,而是去检查链接文件所指向的源文件 |
-P 或 --nofollow 或 -H | When checking whether files exist (if the --existing option is specified), do not follow trailing symbolic links. This causes broken symbolic links to be reported like other files. 检查文件存在时不跟踪符号链接,也就是说将符号链接也当成独立文件进行检索,这和选项 --follow 正好相反 |
-w 或 --wholename | match whole path name (default) |
-i 或 --ignore-case | 忽略大小写 |
-l -n <num> 或 --limit -n <num> | 将输出(或计数)限制为 num 个条目 |
-m 或 --mmap | Ignored for compatibility with BSD and GNU locate. |
-s 或 --stdio | Ignored for compatibility with BSD and GNU locate. |
-0 或 --null | 在输出中使用 NUL 分隔条目 |
-S 或 --statistics | 将每个读取数据库的统计信息写入标准输出,而不是搜索文件并成功退出 |
-q 或 --quiet | 不输出有关读取和处理数据库时遇到的错误的消息。 |
-r 或 --regexp <REGEXP> | 使用基本正则表达式 |
--regex | 使用扩展正则表达式 |
-V 或 --version | 显示版本信息 |
-h 或 --help | 显示帮助 |
五、命令示例
搜索文件名以指定字符串开头的文件
搜索 /etc
目录下所有以 sh
开头的文件:
[root@linuxcool ~]# locate /etc/sh/etc/shadow/etc/shadow-/etc/shells
查找名称中含有指定字符串的文件
查找名称中含有关键词 updatedb
的文件:
[root@htlwk0001host ~]# locate updatedb
/etc/updatedb.conf
/usr/bin/updatedb
/usr/lib/systemd/system/mlocate-updatedb.service
/usr/lib/systemd/system/mlocate-updatedb.timer
/usr/libexec/mlocate-run-updatedb
/usr/share/man/man5/updatedb.conf.5.gz
/usr/share/man/man8/updatedb.8.gz
/usr/share/vim/vim80/ftplugin/updatedb.vim
/usr/share/vim/vim80/syntax/updatedb.vim
注:这不是执行更新命令,后面的 updatedb
是搜索的关键词
使用正则表达式查找特定条件的文件
例如,查找以 /var/lib/rpm
开头的文件:
[root@localhost ~]# locate -r ^/var/lib/rpm
查找 etc.conf
结尾的文件:
[root@localhost ~]# locate -r etc.conf$