首頁 > 軟體

Linux搜尋命令---find

2020-06-16 16:49:34

強大的find命令在Linux中是用來在指定目錄下查詢檔案的,對於find命令來說任何位於引數之前的字串都將被視為將要被查詢的目錄名,而如果使用該命令時,不設定任何引數,則find命令將預設在當前目錄下查詢子目錄與檔案,並且將查詢到的子目錄和檔案全部進行顯示。

一、find 命令格式 (即語法)

1、find命令的一般形式為:

#  find 查詢路徑名 -options [-print -exec -ok ...]

*查詢路徑名:指定具體的目標路徑,不指定預設為當前目錄。

*options(查詢條件):指定的查詢標準,可以為檔名、大小、型別、許可權等標準,預設為找出指定路徑下的檔案

*處理動作:對符合的檔案做操作,預設列印輸出至螢幕。

例如:請在當前目錄下查詢以“.txt”結尾的檔案,操作如下:

在指定了路徑"/app"的情況下,find命令就可以把查詢到的結果“help.txt”列印到螢幕。

2、find命令的引數:

#  pathname: 在find命令所查詢的目錄路徑中,可以用.來表示當前目錄,用/來表示系統根目錄。

find命令不僅可以用絕對路徑進行查詢,同時也可以用相對路徑進行查詢,那麼在“/app”下查詢以“.txt”結尾的檔案,我們也可以用相對路徑來做,操作如下:

注意:其中“.”代表當前,而不輸入路徑則預設為當前。

#  -exec: find命令對匹配的檔案執行該引數所給出的shell命令時,相應命令的形式為"command { } ; ",這裡要注意"{ }"和“;”之間的空格。

#  -ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該引數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓使用者來確定是否執行。

二、find命令工作特點

1、  優點:

#實時查詢

#精確查詢,搜尋整個目錄下所有檔案

#可以對查詢到的檔案驚喜指定動作,即檢視、刪除、移動等等。

2、缺點:

#查詢速度太慢

三、find命令的使用

我們可以把查詢條件想象的分為兩類,即選項和測試條件

1、find命令選項

#指定目錄的查詢範圍

*  -mindepth N 最小搜尋深度

* -maxdepth N 最大搜尋深

* -mindepth N -maxdepth N  只搜尋指定深度

舉例說明一下,我們都知道find命令是預設遞回,如果我們不指定深度的話,它會預設把包含查詢條件的所有子檔案中也列出,比如:

我們可以看到在"/app"路徑下一、二、三、四、五級都包含“hello”,那如果我們直接查詢,"find"就把所有檔案都列出,但如果我們只要第三級目錄下“hello”檔案呢,所以我們需要給"find"指定一個深度,操作如下:

這樣我們就可以得到第三級“/app/1/2”中的“hello”檔案

#查詢空檔案

*  -empty 查詢內容為空的檔案,這個比較簡單直接接到“find”命令後就可以,操作如下:

注意:如果不加路徑,"find”命令同樣會預設為當前目錄。

2、  find命令測試條件

#根據檔名進行查詢

*  -name "檔名”以檔名進行查詢,支援使用glob

*  -iname "檔名” 按檔名不區分大小寫查詢,只支援glob風格的查詢方式:*,[],[^],?

*  -regex "檔名”基於正規表示式查詢檔案,正則部分要用引號引起來,同時要表示檔案的完整路徑,搜尋當前目錄時,用./,搜尋指定目錄時如/app,則用/app/....  ,例如,在當前目錄下把所有以“r..t”開頭“.sh”結尾的檔案列出,操作如下:

*  -inum inode號 以inode號為查詢條件

*  -samefile name 找出與name inode相同的檔案

*  -links n 找到硬連結數為n的檔案

#根據檔案從屬關係進行查詢

*  -user 使用者名稱:查詢屬主為指定使用者(UID)的檔案

*  -group 組名 :查詢屬組為指定組(GID)的檔案

*  -uidUserID:查詢屬主為指定的UID號的檔案

*  -gidGroupID:查詢屬組為指定的GID號的檔案

*  -nouser:查詢沒有屬主的檔案

*  -nogroup:查詢沒有屬組的檔案

具體操作如下:

#根據檔案型別進行查詢  -type  "型別”

*  f: 普通檔案

* d: 目錄檔案

*  l: 符號連結檔案

* s:通訊端檔案

* b: 塊裝置檔案

* c: 字元裝置檔案

* p: 管道檔案

#根據檔案大小進行查詢

* -size [+|-]#UNIT  常用單位:k, M, G,c(byte)  注釋: #UNIT: (#-1, #] ,如6k表示(5k,6k];+#UNIT :(#,∞)  ,如+6k表示(6k,∞);-#UNIT:[0,#-1] ,如-6k 表示[0,5k]。

具體操作如下:

#根據時間進行查詢

* -atime[+|-]time/-amin[+|-]time  以存取時間(天/分鐘)查詢

* -mtime[+|-]time/-mmin[+|-]time  以資料修改時間(天/分鐘)查詢

* -ctime[+|-]time/-cmin[+|-]time  以後設資料修改時間(天/分鐘)查詢

具體操作如下:

#根據檔案許可權進行查詢

* -perm  MODE  精確許可權匹配

* -perm /MODE  :任何一類(u,g,o)物件的許可權中只要能一位匹配即可,相互之間表示或的關係,"+"等同於“/”,但“+” 從CentOS7開始淘汰

* -perm -MODE  :每一類物件都必須同時擁有指定許可權,相互之間表示與的關係

#組合條件測試

* 內容包含    與:-a    或:-o    非:  -not

* 德 摩根定律:

非(A且B)=(非A)或(非B); 非 (A或B)=(非A)且(非B)

3、 處理動作

# -print (預設) 查詢的結果列印到終端

# -ls 查詢的結果顯示詳細資訊,以長檔案的格式輸出

# -delete 將查詢的結果刪除,不互動

# -ok shell command {} ;    查詢到的檔案傳遞給COMMAND命令,提每步都給使用者提示確認操作(互動執行shell命令)

# -exec shell command {} ;  查詢到的檔案傳遞給COMMAND命令,直接修改完成,不給使用者確認(非互動執行shell命令)

# 注意:find將查詢到的檔案路徑一次性傳遞給後面的命令,但有很多命令不能接受過長的引數,從而將會導致命令執行失敗,所以有時我們需要借助xargs命令,來幫助我們進行引數的傳遞,例如 :

[root@centos6 ~]# find /etc -type f | xargs -i  {} cp/app/tmp    -i引數是由find命令的結果傳給xargs命令的,並且由-i指定結果代替符 {}。

到這裡為止我們已經學習完了關於“find”命令的使用方法,也列出了很多常用的命令選項,如果我們能熟練掌握了它們,那麼以後在linux中查詢檔案也將會是一件很容易的事情。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-08/153386.htm


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