歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> find命令詳解

find命令詳解

日期:2017/3/3 11:32:12   编辑:Linux技術

linux中find命令是一種強大的實時查找工具,它通過用戶給出的路徑,在該路徑下的文件系統中進行文件查找。因此在遍歷一個較大的文件系統時會比較花費時間,而且find命令占用資源也是比較大的,所以它的工作特點是,查找的速度略慢,但是可以實現精確查找和實時查找。由於find命令能力很強大所以它的選項也有很多。

find命令格式:

find 【選項】 【查找起始路徑】 【查找條件】 【處理動作】

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

【選項】:[-H] [-L] [-P] [-D debugopts] [-Olevel]這幾個並不常用,其中-H,-L,-P三個選項主要用來處理符號鏈接,

-H表示只跟隨命令行中指定的符號鏈接;

-L表示跟隨所有的符號鏈接;

-P表示不跟隨符號鏈接,默認選項;

【查找起始路徑】:根據用戶跟定的目標起始路徑進行查找,默認是當前目錄;

【查找條件】:根據用戶指定的標准進行查找;默認是找出指定路徑下的所有文件;

查找條件大致分為以下幾類:;

①根據文件名進行查找:

-name;-iname

如:查找當前目錄下以“.cfg結尾的文件”

~]# find . -name "*.cfg"

此處匹配時glob通配符匹配不支持正則表達式。使用-iname可不區分字符大小寫。

②根據文件的從屬關系查找:

-user 用戶名:查找屬主指定用戶的所有文件

-group 組名:查找屬組指定組的所有文件

-nouser:查找沒有屬主的文件

-nogroup:查找沒有屬組的文件

如:查找/etc文件下屬主為user1的文件:

~]# find /etc -user user1

③根據文件類型查找:

-type (f,d,l,c,b,p,s)

f:普通文件

d:目錄文件

l:符號鏈接文件

c:字符設備文件

b:塊設備文件

p:管道文件

s:套接字文件

如:查找/etc文件下屬主為user1的鏈接文件:

~]# find /etc -user user1 -type l

④條件限制,組合使用,匹配多個

與:-a 默認組合邏輯

或:-o

非:-not或!

如:查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄

~]# find /var -user root -a -group mail

⑤根據文件大小查找:

-size [+/-]#UNIT (#代表數字,UNIT代表單位)常用單位k,M,G

#UNIT:(#-1,#] 表示大於#-1,小於等於#的區間

如:查找當前目錄下等於3K的文件,

~]# find ./ -size 3k

-#UNIT:[0,#-1] 表示大於等於0,小於等於#-1的區間

+#UNIT:(#,∞)表示大於#至正無窮的區間

查找/etc目錄行啊大於1M且類型為普通文件的所有文件

~]# find /etc -size +1M -type f

⑥按時間戳查找:

linux文件系統中每個文件都有三種時間戳,以天為單位,分別是:

訪問時間atime(access time),最後一次訪問文件的時間;

狀態改變時間ctime(change time),最後一次改變文件的狀態或屬性的時間

修改時間mtime(modity time),最後一次改變文件內容的時間

-atime [+/-]# (#代表數字)

#:[#,#-1) 表示以時間軸為基准,當下時間為原點,從第#天前到第#-1天之間的時間

-#:(#,0] 表示第#天前到現在的時間

+#:(∞,#-1]表示包括第#-1天之前的時間

-ctime [+/-]#

-mtime [+/-]#

還有一種一分鐘為單位的表示時間,分別為-amin.-cmin,-mmin用法和atime之間完全一樣,就不再舉例說明。

如:查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的文件或目錄

~]# find / \( -nouser -o -nogroup \) -atime -7 -l

查找/etc目錄下最近一周內內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;

~]# find /etc -mtime -7 ! -user root ! -user hadoop -ls

⑦根據權限查找:

-perm [/|-]mode

/mode:表示任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足條件;9位權限之間存在"或"的關系

-mode:表示每一位用戶的權限中的每一位同時符合條件即滿足條件;9位權限之間存在"與"的關系

如:

查找/etc目錄下至少有一類用戶沒有執行權限的文件

~]# find /etc ! -perm -111

【處理動作】對符合查找條件的文件做出操作;默認為輸出值標准輸出。

-print:輸出至標注輸出;默認動作

-ls:類似與對查找到的文件執行ls-l命令。輸出文件的詳細信息

-delete:刪除查找到的文件

-fls /path/to/somefile:把查找到的所有文件的長格式信息保持你至指定文件中

-ok COMMAND{}\;:對查找到的每個文件執行COMAND表示的命令;每次操作都由用戶進行確認;

-exec COMMAND{}\;:對查找到的每個文件執行COMAND表示的命令;

注:{}表示匹配到的文件如:

查找/etc/init.d目錄下,所有用戶都有執行權限,且其他用戶有寫權限的所有文件

~]# find /etc/init.d/ -perm -111 -a -perm -002 -ls

查找/etc文件下以wd結尾的文件,查看文件內容並將文件內容導入當前目錄下file.txt文件中

~]# find /etc -type f -name "*wd" -exec cat {} \; > file.txt

查找/etc目錄下一wd結尾的文件,並找出文件中含有root的行

find /etc/ -name "*wd" -exec grep "root" {} \;

但是在使用-exec選項時,find是將所有匹配到的文件一次性傳遞給exec執行,但是有些文件過長,可能會發生溢出錯誤。

所以需要注意的是:find傳遞查找到的文件路徑至後面的命令時,是先查找出所有符合條件的文件路徑,並一次性傳遞給後面的命令;但有些命令不能接受過長的參數,此時命令執行會失敗;我們可以使用另一種方式可規避此問題:find | xargs COMMAND在此簡單說一下xargs命令,之所以能用到這個命令,主要實時由於很多命令不支持管道來傳遞參數,而平時工作又經常需要,所以有就有了xargs命令。xargs是給命令傳遞參數的一個過濾器,也是組合多個個命令的一個工具。它把一個數據流分割為一些足夠小的快,以方便命令進行處理。xargs從管道或者stdin中讀取數據,並且以空白字符作為分割,所以,有一些包含空白字符的文件名或特殊意義到的名詞時,容易發生誤判。

如前面的例子改動一下:查找當前目錄下以“.cfg結尾的文件” 並刪除 ~]# find . -name "*.cfg" | xargs rm -rf

本文出自 “Minimonster” 博客,請務必保留此出處http://groot.blog.51cto.com/11448219/1813854

Copyright © Linux教程網 All Rights Reserved