whereis 和 which 命令都是只能搜索系統命令的命令,而 locate 命令才是可以按照文件名搜索普通文件的命令。
但是 locate 命令的局限也很明顯,它只能按照文件名來搜索文件,而不能執(zhí)行更復雜的搜索,比如按照權限、大小、修改時間等搜索文件。如果要按照復雜條件執(zhí)行搜索,則只能求助于功能更加強大的 find 命令。locate 命令的優(yōu)點鮮常明顯,那就是搜索速度非??欤液馁M系統資源非常小。這是因為 locate 命令不會直接搜索硬盤空間,而會先建立 locate 數據庫,然后在數據庫中按照文件名進行搜索,是快速的搜索命令。
》》》傳智播客linux培訓班,帶你從新手到大神,咨詢右下角窗口咨詢開班時間《《《
locate 命令的基本信息如下。
命令名稱:locate。
英文原意:find files by name。
所在路徑:/usr/bin/locate。
執(zhí)行權限:所有用戶。
功能描述:按照文件名搜索文件。
命令格式
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 命令的時候,可能會發(fā)現一個問題:如果我們新建立一個文件,那么 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 文件,而且也執(zhí)行了 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 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í)行搜索時,禁止搜索這些文件系統類型PRUNENAMES = ".git.hg.svn"
#在locate執(zhí)行搜索時,禁止搜索帶有這些擴展名的文件PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spod/cups /var/spool/squid /var/tmp"#在locat執(zhí)行搜索時,禁止搜索這些系統目錄
在 locate 執(zhí)行搜索時,系統認為某些文件系統、某些文件類型和某些目錄是沒有搜索必要的,比如光盤、網盤、臨時目錄等,這些內容要么不在 Linux 系統中,是外來存儲和網絡存儲,要么是系統的緩存和臨時文件。剛好 /tmp/ 目錄也在 locate 搜索的排除目錄當中,所以在 /tmp/ 目錄下新建的文件是無法被找到的。