我們經常需要在系統中查找一個檔案,那麼在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
4、which指令
在PATH變量指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果,可以知道系統指令是否存在,以及執行的到底是哪個位置 (PATH差別大小寫)
5、type指令
type指令主要用于區分一個指令到底是shell自帶的還是外部獨立的二進制檔案提供的。如果是shell自帶的則會提示此指令為shell buildin,否則會列出指令的位置。
例如:cd為shell自帶的指令,當用which查找時,which會按照PATH變量設定的路徑進行搜尋,結果顯示no cd in...;用type cd則顯示cd為shell buildin指令。ssh不是shell自帶指令,用type時會顯示ssh的路徑。
參考部落格:https://zhuanlan.zhihu.com/p/50676440