Linux locate命令:按照檔名搜尋檔案

2020-07-16 10:04:32
whereis 和 which 命令都是只能搜尋系統命令的命令,而 locate 命令才是可以按照檔名搜尋普通檔案的命令。

但是 locate 命令的局限也很明顯,它只能按照檔名來搜尋檔案,而不能執行更複雜的搜尋,比如按照許可權、大小、修改時間等搜尋檔案。如果要按照複雜條件執行搜尋,則只能求助於功能更加強大的 find 命令。locate 命令的優點鮮常明顯,那就是搜尋速度非常快,而且耗費系統資源非常小。這是因為 locate 命令不會直接搜尋硬碟空間,而會先建立 locate 資料庫,然後在資料庫中按照檔名進行搜尋,是快速的搜尋命令。

locate 命令的基本資訊如下。
  • 命令名稱:locate。
  • 英文原意:find files by name。
  • 所在路徑:/usr/bin/locate。
  • 執行許可權:所有使用者。
  • 功能描述:按照檔名搜尋檔案。

命令格式

locate 命令只能按照檔名來進行搜尋,所以使用比較簡單。

[[email protected] ~]# locate [選項] 檔名

選項:
  • -i:忽略大小寫

常見用法

【例 1】基本用法。

搜尋 Linux 的安裝紀錄檔。

[[email protected] ~]# locate install.log
/root/install.log
/root/install.log.syslog
#搜尋檔名叫install.log的檔案

系統命令其實也是檔案,也可以按照檔名來搜尋系統命令。

[[email protected] ~]# locate mkdir
/bin/mkdir
/usr/bin/gnomevfs-mkdir
/usr/lib/perl5/auto/POSIX/mkdir.al
…省略部分內容...
#會搜尋出所有含有mkdir字串的檔名,當然也包含mkdir命令


【例 2】locate 命令的資料庫。
我們在使用 locate 命令的時候,可能會發現一個問題:如果我們新建立一個檔案,那麼 locate 命令找不到這個檔案。例如:

[[email protected] ~]# touch cangls
[[email protected] ~]# locate cangls
#新建立的檔案,locate命令找不到

這是因為 locate 命令不會直接搜尋硬碟空間,而會搜尋 locate 資料庫。這樣做的好處是耗費系統資源小、搜尋速度快;缺點是不是實時更新的,而要等使用者退出登入或重新啟動系統時,locate 資料庫才會更新,所以我們無法查詢到新建立的檔案。

既然如此,locate 命令的資料庫在哪裡呢?

[[email protected] ~]#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 命令來手工更新這個資料。例如:

[[email protected] ~]# locate cangls
#沒有更新資料庫時,找不到cangls檔案
[[email protected] ~]# updatedb
#更新資料庫[[email protected] ~]# locate cangls
/root/cangls
#新建立的檔案已經可以搜尋到了

locate組態檔

我們再做一個實驗,看看這是什麼原因導致的。

[[email protected] ~]# touch /tmp/lmls
#在/tmp/目錄下新建立一個檔案
[[email protected] ~]# updatedb
#更新locat資料庫
[[email protected] ~]# locate lmls
#依然查詢不到lmls這個新建檔案

新建立了 /tmp/lmls 檔案,而且也執行了 updatedb 命令,卻依然無法找到這個檔案,這是什麼原因?這就要來看看 located 組態檔 /etc/updatedb.conf了。

[[email protected] ~]#vi /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
#開啟搜尋機制,也就是讓這個組態檔生效
PRUNEFS = "9p afs anonjnodefs auto autofs bdev binfmt_misc cgroup cifs coda
configfs cpuset debugfs devpts ecryptfs exofe fuse fusectl gfs gfe2 hugetlbfs
inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfe nfs4 nfsd pipefe proc ramfs rootfs
rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
#在local執行搜尋時,禁止搜尋這些檔案系統型別
PRUNENAMES = ".git.hg.svn"
#在locate執行搜尋時,禁止搜尋帶有這些擴充套件名的檔案
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spod/cups /var/spool/squid /var/tmp"
#在locat執行搜尋時,禁止搜尋這些系統目錄

在 locate 執行搜尋時,系統認為某些檔案系統、某些檔案型別和某些目錄是沒有搜尋必要的,比如光碟、網路硬碟、臨時目錄等,這些內容要麼不在 Linux 系統中,是外來儲存和網路儲存,要麼是系統的快取和臨時檔案。剛好 /tmp/ 目錄也在 locate 搜尋的排除目錄當中,所以在 /tmp/ 目錄下新建的檔案是無法被找到的。