天天看點

常見的查找檔案指令--find、locate、where、which、type

我們經常需要在系統中查找一個檔案,那麼在Linux系統中我們如何準确高效的确定一個檔案在系統中的具體位置呢?下面我總結了在linux系統中常見的查找檔案的幾個指令。

一、find指令

find是最常用也是最強大的查找指令,它可以查找任何類型的檔案。

find指令的一般格式為:find <指定目錄><指定條件><指定動作>,即find pathname -options [-print -exec -ok]

參數解釋:

pathname:pathname為搜尋的目錄及其子目錄,預設情況下為目前目錄

常用的option選項:

-name:按檔案名來查找檔案

-user:按照檔案的屬主來查找檔案

-group:按照檔案所屬的組來查找檔案

-perm:按照檔案權限來查找檔案

-prune:不在目前指定目錄中查找

例如:已知在/etc,/etc/pam.d以及/user/bin目錄下都有一個名為passwd的檔案,我們看一下-prune的作用

find -name "passwd"  ## 為在目前目錄及其子目錄下下查找名為passwd的檔案
find . -path ./etc -prune -o -name "passwd" -print  ##為在目前目錄及其子目錄(除了/etc目錄及其子目錄)下查找名為passwd的檔案。
find . -path ./etc -prune -o -name "passwd"  ##差別帶-print參數與不帶-print參數
find . -path ./usr -prune -o -name "passwd" -print  ##為在目前目錄及其子目錄(除了/usr目錄及其子目錄)下查找名為passwd的檔案。
find / \( -path /usr/bin -o -path /etc \) -prune -o -name "passwd" -print  ##為在目前目錄及其子目錄(除了/usr/bin目錄及其子目錄;/etc目錄及其子目錄)下查找名為passwd的檔案。由于指令行不能直接識别圓括号,是以要用轉義字元\,在和前後都要有空格。
           

注意:find指令不加任何參數時,表示搜尋路徑為目前目錄及其子目錄,預設的動作為-print,即不過濾任何結果,也就是說輸出所有的檔案。

-mtime -n +n:按照檔案修改時間來查找檔案,-n表示檔案修改時間距現在n天以内,+n表示檔案修改時間據現在n天以前

-type:查找某一類型的檔案(b:塊裝置檔案;d:目錄檔案;c:字元裝置檔案;p:管道檔案;l:連結檔案;f:普通檔案)

-nogroup:查找無有效所屬組的檔案,即檔案所屬的組在/etc/group中不存在

-nouser;查找無有效所屬主的檔案,即檔案的所屬主在/etc/passwd中不存在

想了解具體的find指令使用,可以參考這兩篇部落格:

Linux中find指令-path -prune用法詳解

Linux下find指令詳解

二、locate指令

locate指令實際是"find -name"的另一種寫法,但是查找方式跟find不同,它比find快得多。因為它不搜尋具體目錄,而是在一個資料庫(/var/lib/mlocate/mlocate.db)中搜尋指定的檔案。次資料庫含有本地檔案的所有資訊,此資料庫是linux系統自動建立的,資料庫由updatedb程式來更新,updatedb是由cron daemon周期性建立的,預設情況下為每天更新一次,是以用locate指令你搜尋不到最新更新的檔案,除非你在用locate指令查找檔案之前手動的用updatedb指令更新資料庫。

1、locate安裝

yum install mlocate -y
updatedb
locate 檔案名 #使用方法
           

2、查詢系統上預建的檔案索引資料庫

ll  /var/lib/mlocate/mlocate.db
           

3、依賴于事先建構的索引

索引的建構是在系統較為空閑時自動進行( 周期性任務),管理者手動更新資料庫(updatedb),索引建構過程需要周遊整個根檔案系統,極消耗資源

4、工作特點:

  • 查找速度快
  • 模糊查找
  • 非實時查找
  • 搜尋的是檔案的全路徑,不僅僅是檔案名
  • 可能隻搜尋使用者具備讀取和執行權限的目錄

5、locate 參數

-i:執行不區分大小寫的搜尋

-n N:隻列舉前N 個比對項目

-b:隻比對路徑中的基名

-c:隻顯示統計多少個符合條件的路徑

-r:能基于基本正規表達式來編寫指令

locate foo             #搜尋名稱或路徑中帶有“foo ”的檔案
locate -r ‘.foo$’      #使用Regex 來搜尋以“.foo ”結尾的檔案
           

注意:每次有新檔案更新和删除之後,在updatedb之前資料庫中儲存的檔案資訊不會改變,即新添加一個檔案之後,updatedb之前用locate搜尋不到指定的檔案。同樣再删除一個檔案資訊已經在資料庫中的檔案時,updatedb之前用locate照樣能搜尋到該檔案的資訊,,盡管此時該檔案已經不存在了。

3、whereis指令

查找符合條件的檔案,這些檔案的烈性應屬于源代碼檔案(-s),二進制代碼檔案(-b),或是說明檔案(-m),隻能用于程式名的搜尋。如果省略參數則傳回所有的資訊。 

whereis --help
whereis find
whereis -b find
whereis -m find
whereis -s find

Options:
 -b         search only for binaries
 -B <dirs>  define binaries lookup path
 -m         search only for manuals
 -M <dirs>  define man lookup path
 -s         search only for sources
 -S <dirs>  define sources lookup path
 -f         terminate <dirs> argument list
 -u         search for unusual entries
 -l         output effective lookup paths
           
常見的查找檔案指令--find、locate、where、which、type

4、which指令

在PATH變量指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果,可以知道系統指令是否存在,以及執行的到底是哪個位置 (PATH差別大小寫)

常見的查找檔案指令--find、locate、where、which、type

5、type指令

type指令主要用于區分一個指令到底是shell自帶的還是外部獨立的二進制檔案提供的。如果是shell自帶的則會提示此指令為shell buildin,否則會列出指令的位置。

例如:cd為shell自帶的指令,當用which查找時,which會按照PATH變量設定的路徑進行搜尋,結果顯示no cd in...;用type cd則顯示cd為shell buildin指令。ssh不是shell自帶指令,用type時會顯示ssh的路徑。

常見的查找檔案指令--find、locate、where、which、type

參考部落格:https://zhuanlan.zhihu.com/p/50676440

繼續閱讀