首頁 > 軟體

find命令詳解

2020-06-16 17:07:17

1.3 locate查詢補充

使用locate查詢,實際是對資料庫儲存內容的列出,在查詢前會判定目錄有沒rx許可權,如果沒有許可權,依然不列出。此操作在資料庫中進行,而非實時查詢。如果我們想在不退出登入的情況下更新資料庫,則要用到updatedb命令,該命令更新很慢,具體時間視你的系統中有多少檔案而定。

二、find命令

由於locate的非精確查詢和非實時查詢的特性,導致locate用的不多。而find命令支援實時查詢,擁有眾多查詢選項,是linux上查詢最常用的,但是缺點也是比較明顯: 如果檔案數量很多的話,查詢起來很慢。但那又如何,find依然是最有用且最常用的Linux查詢命令。

2.1 find命令特點

  •   查詢速度略慢
  •   精確查詢
  •   實時查詢
  •   可能只搜尋使用者具備讀取和執行許可權的目錄

2.2 find用法

命令:find

格式:find [OPTION]... [查詢路徑] [查詢條件] [處理動作]

查詢路徑:指定具體目標路徑;預設為當前目錄 

查詢條件:指定的查詢標準,可以檔名、大小、型別、許可權等標準進行;預設為找出指定路徑下的所有檔案

處理動作:對符合條件的檔案做操作,預設輸出至螢幕

2.3 find選項

2.3.1指搜尋層級查詢

-maxdepth level 最大搜尋深度

-mindepth level  最小搜尋深度

Example:

 
 1  [root@ keer app]#find -maxdepth 7
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 [root@ keer app]#find -mindepth 7
20 
21 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
 

2.3.2 按檔名和inode號查詢

-name “檔名稱”  基於名稱的精確查詢

-iname  基於名稱忽略大小寫的精確查詢

-inum n  基於inode號查詢(只顯示名稱,長列出則加-ls)

-samefile  基於相同inode號的查詢(查詢硬連結)

-links n  硬連結為n的檔案

-regex “PATTERN”  支援正則(預設只支援範圍,不支援萬用字元)

-regextype egrep -regex    支援egrep同標準的正則

Example:

 
 1 [root@ keer app]#find -name hello
 2 
 3 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 4 
 5 [root@ keer app]#find -iname HELLO
 6 
 7 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 8 
 9 [root@ keer app]#find -inum 1310721
10 
11 ./dev1
12 
13 [root@ keer app]#find -inum 1310721 -ls
14 
15 1310721    4 drwxr-xr-x   3 root     root         4096 Aug  8 16:47 ./dev1
16 
17 #因為find -regex匹配的是整個路徑,所以前面必須加.*才可以
18 
19 [root@ keer app]#find . -regex ".*[a-z].*"
20 
21 ./dev1
22 
23 ./dev1/dev2
24 
25 ./dev1/dev2/dev3
26 
27 ./dev1/dev2/dev3/dev4
28 
29 ./dev1/dev2/dev3/dev4/dev5
30 
31 ./dev1/dev2/dev3/dev4/dev5/dev6
32 
33 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 

2.3.3 根據屬主查詢

-user 使用者名稱  基於檔案owner的查詢

-uid userid 基於檔案uid的查詢

-nouser 查詢沒有owner的檔案

Example:

 
 1 [root@ keer app]#find -user root
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20 
21 [root@ keer app]#find -uid 0
22 
23 .
24 
25 ./dev1
26 
27 ./dev1/dev2
28 
29 ./dev1/dev2/dev3
30 
31 ./dev1/dev2/dev3/dev4
32 
33 ./dev1/dev2/dev3/dev4/dev5
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36 
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38 
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40 
41 [root@ keer app]#find -nouser
42 
43 ./aaa
 

2.3.4 根據屬組查詢

-group 組名 基於檔案group的查詢

-gid groupid 基於檔案gid的查詢

-nogroup 查詢沒有group的檔案

Example:

 
 1 [root@ keer app]#find -group root
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20 
21 [root@ keer app]#find -gid 0
22 
23 .
24 
25 ./dev1
26 
27 ./dev1/dev2
28 
29 ./dev1/dev2/dev3
30 
31 ./dev1/dev2/dev3/dev4
32 
33 ./dev1/dev2/dev3/dev4/dev5
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36 
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38 
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40 
41 [root@ keer app]#find -nogroup
42 
43 ./aaa
 

2.3.5根據檔案型別查詢

-type TYPE:

f: 普通檔案

d: 目錄檔案

l: 符號連結檔案

s:通訊端檔案

b: 塊裝置檔案

c: 字元裝置檔案

p: 管道檔案

Example:

 
 1 [root@ keer app]#find -type f
 2 
 3 ./aaa
 4 
 5 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 6 
 7 [root@ keer app]#find -type d
 8 
 9 .
10 
11 ./dev1
12 
13 ./dev1/dev2
14 
15 ./dev1/dev2/dev3
16 
17 ./dev1/dev2/dev3/dev4
18 
19 ./dev1/dev2/dev3/dev4/dev5
20 
21 ./dev1/dev2/dev3/dev4/dev5/dev6
22 
23 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
 

2.3.6組合查詢

  •   查詢條件:

與:-a(可省略)

或:-o  非:-not, !

  •   德·摩根定律:

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

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

Example:

1 !A -a !B = !(A -o B)
2 
3 !A -o !B = !(A -a B)

2.3.7 按檔案大小查詢

-size [+|-]#UNIT 根據檔案大小來查詢

常用單位:k, M, G,c(byte)

#UNIT: (#-1, #]如:6k 表示(5k,6k]

-#UNIT:[0,#-1]如:-6k 表示[0,5k]

+#UNIT:(#,∞)如:+6k 表示(6k,∞)

更直觀的可以從下圖中看出:

 

2.3.8 按時間戳查詢

  •   以“天”為單位

-atime [+|-]#

#UNIT: [#,#+1) 例:3 表示前3天到4天

-#UNIT:[#+1,∞]  例:-3 表示4天以前

+#UNIT:[0,#)  例:+3 表示三天之內

-mtime

-ctime

  •     以“分鐘”為單位

-amin

-mmin

-cmin

    更直觀的可以從下圖中看出:

2.3.9 按許可權查詢

-perm

mode:精確許可權匹配

          +mode[/mode] 任何一類(u,g,o)物件的許可權中只要能一位匹配即可(或關係)。(“+”從CentOS7開始淘汰)

          -mode 每一類物件都必須同時擁有指定許可權(與關係)。

註:0 表示不關注。

Example:

•  find -perm 755會匹配許可權模式恰好是755的檔案

•  只要當任意人有寫許可權時,find -perm /222就會匹配

•  只有當每個人都有寫許可權時,find -perm -222才會匹配

•  只有當其它人(other)有寫許可權時,find -perm -002才會匹配(/002也可)    

2.4 find補充

2.4.1 處理動作

    -print 預設

    -delete 直接刪除所查詢到的檔案,不詢問。

    -ls 長列出所查詢到的檔案

    -fls file 將查詢到的檔案長列出匯入到指定檔案。

        配合重定向使用(> file)

    -ok command ; 對查詢到的檔案當做下一命令的引數去執行(互動式確認)

-exec command ; 對查詢到的檔案當做下一命令的引數去執行(非互動式)

註:使用-ok和-exec時,必須以“ ;”結尾

Example:

1、備份以“.conf”結尾的檔案,並新增.orig擴充套件名

 find-name “*.conf” -exec cp {} {}.orig ;

2、在你的主目錄中尋找可被其它使用者寫入的檔案,並取消這些檔案其他使用者的寫許可權

 find ~ -perm -002   -exec chmodo-w {} ;

2.4.2 引數替換xargs

在我們使用的過程中,由於很多命令不支援管道符“|”來傳遞引數,但是在我們的日常工作中有這個必要,於是,就出現了xargs命令。xargs用於產生某個命令的引數,可以讀入 stdin 的資料,並且以空格符或回車符將 stdin 的資料分割成為 arguments。在這裡我們需要注意的是,檔名或者其他意義的名詞內含有空格符的情況。

當然,有些命裡不能接受過多引數,這樣命令可能會執行失敗,這種情況也可以用xargs來解決。

Example:

1、尋找以f開頭的檔案,並刪除。

 ls f* |xargs     rm

2、尋找/sbin下所屬者許可權位為滿的檔案,並長列出。

 find /sbin -perm +700 | xargs ls –l

 

三、小練習

  說了這麼多,我們來做一些練習練練手吧~活學活用才能更好的掌握喏?(?????)?

1、查詢/var目錄下屬主為root,且屬組為mail的所有檔案

 find /var -user root -group mail -ls

2、查詢/var目錄下不屬於root、lp、gdm的所有檔案

 find /var ! ( -user root -o -user lp -o -user gdm ) -ls

3、查詢/var目錄下最近一週內其內容修改過,同時屬主不為root、也不是postfix的檔案

 find /var -mtime +7 ! ( -user root -user postfix ) -ls

4、查詢當前系統上沒有屬主或屬組,且最近一個週內曾被存取過的檔案

 find / -nouser -o -nogroup -atime +7 -ls

5、查詢/etc目錄下大於1M且型別為普通檔案的所有檔案

 find /etc/ -size +1M -type f -ls

6、查詢/etc目錄下所有使用者都沒有寫許可權的檔案

 find /etc/ ! -perm /222 -ls

7、查詢/etc目錄下至少有一類使用者沒有執行許可權的檔案

 find /etc/ ! -perm -111 -ls

8、查詢/etc/init.d目錄下,所有使用者都有執行許可權,且其它使用者有寫許可權的檔案

 find /etc/init.d/ -perm -113 -ls

  以上。如有不足之處還請大家多多指教喏?(?>?<?)?

Linux查詢find命令詳解  http://www.linuxidc.com/Linux/2017-01/140011.htm

Linux下的檔案查詢命令——find  http://www.linuxidc.com/Linux/2016-05/131826.htm

Linux檔案查詢命令之locate與find  http://www.linuxidc.com/Linux/2017-02/140272.htm

Linux檔案搜尋命令 find  http://www.linuxidc.com/Linux/2016-11/137267.htm

5分鐘學會find命令 http://www.linuxidc.com/Linux/2016-11/137051.htm

find命令基本使用一覽 http://www.linuxidc.com/Linux/2016-07/133273.htm

Linux基礎知識:find命令的使用 http://www.linuxidc.com/Linux/2016-09/134947.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-09/146933.htm


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