whereis 和 which 命令都是只能搜索系統(tǒng)命令的命令,而 locate 命令才是可以按照文件名搜索普通文件的命令。
但是 locate 命令的局限也很明顯,它只能按照文件名來(lái)搜索文件,而不能執(zhí)行更復(fù)雜的搜索,比如按照權(quán)限、大小、修改時(shí)間等搜索文件。如果要按照復(fù)雜條件執(zhí)行搜索,則只能求助于功能更加強(qiáng)大的 find 命令。locate 命令的優(yōu)點(diǎn)鮮常明顯,那就是搜索速度非??欤液馁M(fèi)系統(tǒng)資源非常小。這是因?yàn)?locate 命令不會(huì)直接搜索硬盤(pán)空間,而會(huì)先建立 locate 數(shù)據(jù)庫(kù),然后在數(shù)據(jù)庫(kù)中按照文件名進(jìn)行搜索,是快速的搜索命令。
locate 命令的基本信息如下。
命令名稱:locate。
英文原意:find files by name。
所在路徑:/usr/bin/locate。
執(zhí)行權(quán)限:所有用戶。
功能描述:按照文件名搜索文件。
命令格式
locate 命令只能按照文件名來(lái)進(jìn)行搜索,所以使用比較簡(jiǎn)單。
[root@localhost ~]# locate [選項(xiàng)] 文件名
選項(xiàng):
-i:忽略大小寫(xiě)
常見(jiàn)用法
【例 1】基本用法。
搜索 Linux 的安裝日志。
[root@localhost ~]# locate install.log
/root/install.log
/root/install.log.syslog
#搜索文件名叫install.log的文件
系統(tǒng)命令其實(shí)也是文件,也可以按照文件名來(lái)搜索系統(tǒng)命令。
[root@localhost ~]# locate mkdir
/bin/mkdir
/usr/bin/gnomevfs-mkdir
/usr/lib/perl5/auto/POSIX/mkdir.al
…省略部分內(nèi)容...
#會(huì)搜索出所有含有mkdir字符串的文件名,當(dāng)然也包含mkdir命令【例 2】locate 命令的數(shù)據(jù)庫(kù)。
我們?cè)谑褂?locate 命令的時(shí)候,可能會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:如果我們新建立一個(gè)文件,那么 locate 命令找不到這個(gè)文件。例如:
[root@localhost ~]# touch cangls
[root@localhost ~]# locate cangls
#新建立的文件,locate命令找不到
這是因?yàn)?locate 命令不會(huì)直接搜索硬盤(pán)空間,而會(huì)搜索 locate 數(shù)據(jù)庫(kù)。這樣做的好處是耗費(fèi)系統(tǒng)資源小、搜索速度快;缺點(diǎn)是不是實(shí)時(shí)更新的,而要等用戶退出登錄或重啟系統(tǒng)時(shí),locate 數(shù)據(jù)庫(kù)才會(huì)更新,所以我們無(wú)法查找到新建立的文件。
既然如此,locate 命令的數(shù)據(jù)庫(kù)在哪里呢?
[root@localhost ~]#ll /var/lib/mlocate/mlocate.db-rw-r----- 1 root slocate 2328027 6月 14 02:08/var/lib/ mlocate/mlocate.db#這是 locate 命令實(shí)際搜索的數(shù)據(jù)庫(kù)的位置
這個(gè)數(shù)據(jù)庫(kù)是二進(jìn)制文件,不能直接使用 Vim 等編輯器査看,而只能使用對(duì)應(yīng)的 locate 命令進(jìn)行搜索。如果我們不想退出登錄或重啟系統(tǒng),則也可以通過(guò) updatedb 命令來(lái)手工更新這個(gè)數(shù)據(jù)。例如:
[root@localhost ~]# locate cangls
#沒(méi)有更新數(shù)據(jù)庫(kù)時(shí),找不到cangls文件
[root@localhost ~]# updatedb
#更新數(shù)據(jù)庫(kù)[root@localhost ~]# locate cangls/root/cangls
#新建立的文件已經(jīng)可以搜索到了
locate配置文件
我們?cè)僮鲆粋€(gè)實(shí)驗(yàn),看看這是什么原因?qū)е碌摹?br />
[root@localhost ~]# touch /tmp/lmls
#在/tmp/目錄下新建立一個(gè)文件
[root@localhost ~]# updatedb
#更新locat數(shù)據(jù)庫(kù)
[root@localhost ~]# locate lmls
#依然查詢不到lmls這個(gè)新建文件
新建立了 /tmp/lmls 文件,而且也執(zhí)行了 updatedb 命令,卻依然無(wú)法找到這個(gè)文件,這是什么原因?這就要來(lái)看看 located 配置文件 /etc/updatedb.conf了。
[root@localhost ~]#vi /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
#開(kāi)啟搜索機(jī)制,也就是讓這個(gè)配置文件生效
PRUNEFS = "9p afs anonjnodefs auto autofs bdev binfmt_misc cgroup cifs codaconfigfs cpuset debugfs devpts ecryptfs exofe fuse fusectl gfs gfe2 hugetlbfsinotifyfs iso9660 jffs2 lustre mqueue ncpfs nfe nfs4 nfsd pipefe proc ramfs rootfsrpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"#在local執(zhí)行搜索時(shí),禁止搜索這些文件系統(tǒng)類型PRUNENAMES = ".git.hg.svn"
#在locate執(zhí)行搜索時(shí),禁止搜索帶有這些擴(kuò)展名的文件PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spod/cups /var/spool/squid /var/tmp"#在locat執(zhí)行搜索時(shí),禁止搜索這些系統(tǒng)目錄
在 locate 執(zhí)行搜索時(shí),系統(tǒng)認(rèn)為某些文件系統(tǒng)、某些文件類型和某些目錄是沒(méi)有搜索必要的,比如光盤(pán)、網(wǎng)盤(pán)、臨時(shí)目錄等,這些內(nèi)容要么不在 Linux 系統(tǒng)中,是外來(lái)存儲(chǔ)和網(wǎng)絡(luò)存儲(chǔ),要么是系統(tǒng)的緩存和臨時(shí)文件。剛好 /tmp/ 目錄也在 locate 搜索的排除目錄當(dāng)中,所以在 /tmp/ 目錄下新建的文件是無(wú)法被找到的。