Linux操作系统之locate命令详解:通过文件名称来查找文件(与find命令进行全局搜索不同,locate命令是读取数据文件(/var/lib/locatedb)进行查找;由于缩小了查找的范围,因此locate命令查找文件会比find命令速度快很多)
前言
①locate 命令让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。
②locate 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索数据库/var/lib/mlocate/mlocate.db。
③/var/lib/mlocate/mlocate.db数据库中含有系统本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立的文件却无法查找到,原因就是因为数据库文件没有被更新。
④查找文件为了避免这种情况,可以在使用locate命令查找文件之前,先使用updatedb命令手动更新数据库。
整个locate工作其实是由四部分组成的:
-
/usr/bin/updatedb 主要用来更新数据库,通过crontab自动完成的
-
/usr/bin/locate 查询文件位置
-
/etc/updatedb.conf updatedb的配置文件
-
/var/lib/mlocate/mlocate.db 存放文件信息的文件
⑤locate命令功能:
locate命令可以在搜寻数据库时快速找到档案,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab) locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。 locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。
⑥locate命令特点:
- 非实时,模糊匹配,查找是根据全系统文件数据库进行的;
- updatedb, 手动更新生成文件数据库,默认第天凌晨4点02分更新数据库
- 查找速度快
⑦find命令特点:
- 实时
- 精确
- 支持众多查找标准
- 支持搜索指定目录中的所有文件完成查找,查找速度慢
⑧为了时效性查找,在使用locate命令之前可以先更新库:
sudo updatedb
命令语法格式
locate【参数】待查找的文件
locate [OPTION] [PATTERN]
参数解释
-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 限制为 LIMIT项目的输出 (或 计数) -m, --mmap 忽略向后兼容性-P, --nofollow, -H 当检查文件时不跟随蔓延的符号 -, --null null 输出时以 NUL 分隔项目 -S, --statistics 不搜索项目,显示有关每个已用数据库的统计信息 -q, --quiet 安静模式,不会显示任何错误讯息 -r, --regexp REGEXP 使用基本正则表达式 --regex 使用扩展正则表达式 -s, --stdio 忽略向后兼容性-V, --version 显示版本信息 -w, --wholename 匹配整个路径名(默认)
实例
1、搜索/etc目录下所有以my开头的文件:
[informix@node2 ~]$ locate /etc/my /etc/my.cnf /etc/my.cnf.d
2、刚刚新增的文件无法使用locate命令查找,使用updatedb命令更新(系统内所有档案名称及路径的数据库)。
[root@cent6 ~]# touch new.txt [root@cent6 ~]# locate new.txt [root@cent6 ~]# updatedb [root@cent6 ~]# locate new.txt /root/new.txt
3、查找当前系统中所有包含a.txt的文件
root@DESKTOP-1N42TVH:/home/test# locate a.txt /home/test/a.txt /mnt/c/Program Files/Windows NT/TableTextService/TableTextServiceTigrinya.txt /mnt/c/Program Files (x86)/Internet Download Manager/Languages/tips_fa.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/AccessRuntime2019_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/AccessRuntime2021_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/AccessRuntime_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/Client2019_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/Client2021_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/ClientARMRefer2019_eula.txt /mnt/c/Program Files (x86)/Microsoft Office/root/Office16/2052/ClientARMRefer_eula.txt
4、locate命令限定查找到的文件的数目为3个
root@DESKTOP-1N42TVH:/home/test# locate -n 3 a.txt /home/test/a.txt /mnt/c/Program Files/Windows NT/TableTextService/TableTextServiceTigrinya.txt /mnt/c/Program Files (x86)/Internet Download Manager/Languages/tips_fa.txt
5、locate查找文件忽略文件大小写查询
root@DESKTOP-1N42TVH:/home/test# ls a.txt xYAbzM.txt xyabzm.txt root@DESKTOP-1N42TVH:/home/test# locate xyabzm.txt /home/test/xyabzm.txt root@DESKTOP-1N42TVH:/home/test# locate xyabzm.txt -i /home/test/xYAbzM.txt /home/test/xyabzm.txt
6、locate查找文件统计数量
root@DESKTOP-1N42TVH:/home/test# ls a.txt xYAbzM.txt xyabzm.txt
root@DESKTOP-1N42TVH:/home/test# locate xyabzm.txt /home/test/xyabzm.txt
root@DESKTOP-1N42TVH:/home/test# locate -c xyabzm.txt 1
root@DESKTOP-1N42TVH:/home/test# locate -i xyabzm.txt /home/test/xYAbzM.txt /home/test/xyabzm.txt root@DESKTOP-1N42TVH:/home/test# locate -c -i xyabzm.txt 2
7、locate命令使用正则表达式匹配文件名称查找
root@DESKTOP-1N42TVH:/home/test# ls a.txt xYAbzM.txt xyabzm.txt
root@DESKTOP-1N42TVH:/home/test# locate -r xy* ## 查找以xy开头的行 /home/test/xyabzm.txt
root@DESKTOP-1N42TVH:/home/test# locate -r xY* ## 查找以xY开头的行 /home/test/xYAbzM.txt
root@DESKTOP-1N42TVH:/home/test# locate -r zm.txt$ ## 查找以zm.txt结尾的行 /home/test/xyabzm.txt