概覽:在Linux中使用文件系統時,經常會有這查找文件的需要。那麼如何按照我們的需求去找出相應的文件。在這裡我推薦兩個命令,locate命令和find命令。此篇博文主要向大家介紹find命令的用法。
那麼為什麼不講locate而只講find命令?在這裡,我有必要解釋一下這兩個命令的工作機制。
一、locate命令工作機制
在linux系統中會事先構建好一個文件索引數據庫用於給locate查詢,來找到符合用戶需求的文件。這個數據庫是由Linux系統自動進行為維護和更新的。所以這不是實時查找,舉個例子,當你在使用過程中新建了一個文件,而工作了一段時間你忘了這個文件具體在哪裡放著,你想找到這個文件,那麼就需要查找,如果用locate來查找的話,此時數據庫並沒有實時更新。當然你也可以用updatedb命令來手動更新系統的數據庫,但更新數據庫的代價比較大,會增加系統消耗。此時,我們就推薦另一個查找命令——find命令。
二、find命令工作機制
find命令是Linux系統中的實時查找文件工具,它是通過遍歷用戶指定起始路徑下文件系統層級結構來完成文件查找,即查找你指定目錄下的所有文件及其子目錄的文件。
三、find命令的工作特性
1、查找速度略慢。
2、實現精確查找。
3、實時查找。
四、find命令使用方法
使用格式:find [OPTIONS] [查找起始路徑] [查找條件] [處理動作]
查找起始路徑:指定具體搜索目標地起始路徑;默認為當前目錄。
查找條件:用戶指定的查找標准(表達式),例如文件的文件名、大小、類型、從屬
關系、權限等;如不指定,則查找出當前目錄下的所有文件。
處理動作:對符合查找條件做出的操作,例如刪除等處理操作;如不指定,默認為輸
出至標准輸出。
查找條件規范:
表達式:選項和測試
·1、測試:結果是布爾型(“true”,“false”)
(1)根據文件名查找:
選項:
-name "pattern":根據被模式匹配到的文件名進行查找。
-iname "pattern":根據被模式匹配到的文件名進行查找。忽略字符大
小寫。
注意:此處的模式(pattern)是根據bash的globbing風格來查找。
-regex "pattern":基於正則表達式模式來查找文件,匹配的是整個路徑
而非文件名。
(2)根據文件的從屬關系進行查找
選項:
-user USERNAME:查找從屬於指定用戶的文件
-group GROUPNAME: 查找從屬於指定用戶組的文件
-uid UID:查找屬主指定的UID的所有文件
-gid GID:查找屬組指定的GID的所有文件
-nouser :查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
注意:針對特定的某一用戶被刪除之後,從屬於這一用戶的文件則會變為無屬
主、無屬組的文件,此時文件從屬於原先此用戶的用戶ID和組ID。
(3)根據文件的類型進行查找。
選項:
-type TYPE:
f:普通文件
d:目錄文件
l:符號鏈接文件
b:塊設備文件
c:字符設備文件
p:管道文件
s:套接字文件
(4)根據文件的大小進行查找
選項:
-size [+|-] NUMBER 單位 默認單位為字節
[+|-] NUMBER K
[+|-] NUMBER M
[+|-] NUMBER G
注:+ 表示大於,- 表示小於,無則表示精確
注意:1、精確是指(NUMER-1,NUMBER]的范圍,不能比它小太多,不能比它大。
2、- 大於的范圍是[0,#-1],即比它小1以下的大小。
3、+ 大於的范圍是(NUMBER,∞)。
(5)根據時間戳查找:
選項:
以“天”為單位,向過去的時間倒回。
-atime [+|-] NUMBER:訪問時間
NUMBER(精確時間) : [NUMBER,NUMBER-1]
-NUMBER(最近NUMBER天內): (NUMBER,0)
+NUMBER(超過NUMBER天): (∞,NUMBER-1)
-mtime [+|-] NUMBER:修改時間(文件內容)
-ctime [+|-] NUMBER:改變時間(元數據)
以“分鐘”為單位: (與上雷同)
-amin [+|-] NUMBER
-mmin [+|-] NUMBER
-cmin [+|-] NUMBER
例如:查找/etc目錄下最近一周內其內容修改過的文件
~]# find /etc/ -mtime -7
(6)根據權限查找
選項:
-perm [/|-] mode
mode : 精確權限匹配:
-mode :全部用戶(u,g,o)的權限中的每一位(r,w,
x)都符合條件即滿足查找條件,9位權限之間是"與"關系。
/mode :任何一類用戶(u,g,o)的權限中的任何一位(r,w,
x)符合條件即滿足(9位有一位符合即可)9位權限是"或"關系。
例如:1、查找/etc/目錄下對於至少有一類用戶有執行權限的文件。
~]# find /etc/ -perm /111
2、查找/etc/init.d目錄下,所有用戶都有執行權限,且其他用戶有
寫權限的普通文件。
~]# find /etc/init.d/ -perm -113 -type f
~]# find /etc/init.d/ -perm -222 -a -perm 002 -type f
·2、組合測試:
與(and):-a, 默認組合多個條件時的邏輯
或(or):-o
非:-not
例如:1、查找/etc目錄下超過一周其內容被修改過,且文件大小不超過5M.
~]# find /etc/ -mtime -7 -a -not -size -5M
2、查找/etc目錄下所有用戶都沒有寫權限的普通文件。
思路:反向解析題意即至少有一類用戶有寫權限;
~]# find /etc/ -not -perm /222 -type f
3、查找/etc目錄下至少有一類用戶都沒有寫權限的普通文件。
思路:反向解析題意即所有用戶有寫權限
~]# find /etc/ -not -perm -222 -type f
處理動作:
-print:輸出至標准輸出,默認動作
-ls:類似於對查找到的文件執行“ls -l”命令,輸出文件的詳細信息
-delete:刪除查到的文件
-file 文件路徑:把查找到的所有文件的長格式信息保存至指定文件中;
-ok COMMAND {} \; : 對查找到的每個文件執行由COMMAND表示的命令;每次操作都得
由用戶進行確認;
-exec COMMAND {} \; : 對查找到的每個文件執行由COMMAND表示的命令。
注意:find傳遞查找到的文件路徑傳至後面的命令時,實現查找出所有符合條件的文件路
徑,並一次傳遞給後面的命令;但是有些命令不能接受過長的參數,此時命令會執行
失敗;另一種方式可規避此問題:
~]# find | xargs COMMAND
總結:find命令的眾多查找選項和條件的組合可以更好地為用戶的查找文件的需求服務,但是對於根據文件大小的具體大小范圍以及時間戳部分的時間范圍需要深刻理解,才能找到你符合你需求的文件。另外權限部分的理解也很重要,初學者很容易會繞暈,建議查看文件權限相關基礎內容。讓find命令成為你使用Linux的一把利器。
Linux find 命令用法總結 http://www.linuxidc.com/Linux/2015-04/116854.htm
Linux下查找文件find命令 http://www.linuxidc.com/Linux/2014-10/108575.htm
Linux下find命令詳解 http://www.linuxidc.com/Linux/2011-08/40669.htm
文本查找利器find的使用 http://www.linuxidc.com/Linux/2014-03/97559.htm
功能強大的find命令 http://www.linuxidc.com/Linux/2014-01/95236.htm
Linux系統find命令詳解 http://www.linuxidc.com/Linux/2014-06/103232.htm