首頁 > 軟體

Linux命令之find命令詳解

2020-06-16 17:48:21

概覽:在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

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-12/126634.htm


IT145.com E-mail:sddin#qq.com