概述
由于Linux一切皆文件,我們的日常運維工作其實就是與文件打交道的事,如何能夠快速而有效地找到我們需要的文件呢?這是個令人頭疼的問題。幸運是,Linux為用戶提供了強大的查找工具——find。find通過遍歷指定路徑完成文件查找,它的的工作特點:
-
精確查找——多查詢條件組合,精確匹配;
-
實時查找——遍歷指定路徑;
-
查找速度稍慢——由于需要遍歷路徑,速度上受限于文件數量;
-
可能只搜索用戶具備讀取和執行權限的目錄——基于Linux系統的用戶安全權限。
本文基于 GNU/Linx CentOS 7.2.1511,介紹了find命令的日常用法,主要探討了find的表達式的各種條件查找:
-
find詳解
-
1. 命令格式
-
2. 常用選項
-
3. 查找條件
3.1. 根據文件名和 inode 查找
3.2. 根據文件類型查找
3.3. 根據屬主屬組查找
3.4. 根據文件大小查找
3.5. 根據文件時間戳查找
3.6. 根據權限查找
3.7. 多條件查找&德摩根定律 -
4. 動作處理
-
結束語
find詳解
1. 命令格式
find [OPTION] [PATH…] [expression]
OPTION : 命令選項。所有的選項都總是返回真值,它們總會被執行,除非放在表達式中執行不到的地方。因此,清楚起見,最好把它們放在表達式的開頭部分。
PATH… : 搜索路徑。 支持多個路徑搜索,沒有路徑參數,缺省用當前目錄。還有一個重要方面是,搜索結果的格式取決于正在搜索的路徑。若使用的是相對路徑,結果也是按相對路徑給出;若使用的是絕對路徑,搜索結果將都是按絕對路徑給出的。
expression :表達式。find的表達式可以分為兩個部分:查找條件和處理動作。這也正是find命令的精髓所在。
-
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
-
處理動作:對符合條件的文件做操作,默認輸出至屏幕
2. 常用選項
– P 這是默認的行為。當遇到鏈接文件時,查找條件匹配的是符號鏈接本身的屬性。
-L 當遇到鏈接文件時,追尋鏈接文件的目標進行查找。查找條件匹配的是目標文件的屬性。
-Olevel 查詢優化。優化level分0-3四個等級。
3. 查找條件
find命令有很多種查找條件,下面我將和大家一起通過實例演示,對常用的查找條件進行介紹:
3.1. 根據文件名和 inode 查找
-name " FILENAME " :支持使用 glob*, ?, [], [^]
-iname " FILENAME" :不區分字母大小寫
我們查找/etc/路徑下名為passwd的文件,
注意:當我們使用通配符進行查找時,為了防止shell以我們不期望的方式解釋通配符,就必須用引號把搜索內容括起來。
-inum N 按 inode 號查找
-samefile FILENAME 相同 inode 號的文件
-links N 鏈接數為 n 的文件
-regex "PATTERN" 以 PATTERN 匹配整個文件路徑字符串,而不僅僅是文件名稱
3.2. 根據文件類型查找
-type TYPE 根據指定文件類型查找文件,支持的文件類型有:
-
f: 普通文件
-
d: 目錄文件
-
l: 符號鏈接文件
-
s :套接字文件
-
b: 塊設備文件
-
c: 字符設備文件
-
p: 管道文件
3.3. 根據屬主屬組查找
-user USERNAME 查找屬主為指定用戶 (UID) 的文件
-group GRPNAME 查找屬組為指定組 (GID) 的文件
-uid UserID 查找屬主為指定的 UID 號的文件
-gid GroupID 查找屬組為指定的 GID 號的文件
-nouser 查找沒有屬主的文件
-nogroup 查找沒有屬組的文件
如上圖看到,我們查找的是jacky用戶,為什么出來的是zhaoqi用戶的呢?我們再來看看jacky和zhaoqi的用戶信息:
由此我們可以知道,如果用戶名A和用戶B,UID相同,查找用戶A的話,也能找到B用戶的文件,find的用戶查找是從系統角度出發,只認UID的。
3.4. 根據文件大小查找
-size [+|-]#UNIT 常用單位: k, M, G
文件的大小,以指定數字的話(比如10M),一般有三種情況:大于10M、小于10M和等于10M。為了有助于理解,三種情況可以表示為下圖:
3.5. 根據文件時間戳查找
以“天”為單位的(#UNIT表示用數字指定的時間)
-amin [+|-]#UNIT
-mtime [+|-]#UNIT
-ctime [+|-]#UNIT
以“分鐘”為單位的
-amin [+|-]#UNIT
-mmin [+|-]#UNIT
-cmin [+|-]#UNIT
同樣的,相對于指定時間,以7天為例,也有三種情況:小于7天、等于7天和大于七天。同樣便于理解,以-atime為例示圖如下:
3.6. 根據權限查找
-perm [/|-]MODE (MODE表示以8進制數字表示的用戶權限)
我們先創建如下文件進行權限查找演示:
我們分別666、-222、/222、/200、-200和400查找:
由示例可以看到:
-
-perm 666和-perm 400時,需要對應位權限精確匹配
-
-perm -222時,要求三個權限為都必須是2
-
-perm /222時,三個權限為任一有2就匹配
-
-perm /200和-perm -200時,0表示所在位權限不關心。
因此我們得出指定權限的結論:
-
MODE:精確權限匹配
-
/MODE:任何一類 (u,g,o) 對象的權限中只要能一位匹配即可,是或關系,(+MODE從 centos7 開始淘汰)
-
-MODE :每一類對象都必須同時擁有指定權限,與關系0 表示不關注
3.7. 多條件查找&德摩根定律
find多條件查找時,各查找條件是按邏輯關系進行關聯起來的。即 組合條件:
-
與: -a
-
或: -o
-
非: -not, !
我們先創建7個文件:
示例一:各條件之間是默認存在-a(與)關系
示例二 :在一般情況下,-a(與) 的優先級高于-o(或),如果需要提高-o(或)優先級,則需要添加 \( \) 把括起來。
示例三:不包含a字符,并且 不包含b字符的文件,即! A -a ! B = ! \( A -o B \)
示例四:不包含a字符,或者 不包含b字符的文件,即! A -o ! B = ! \( A -a B \)
由示例三和示例四可以知道,find多條件間關系是符合德摩根定律的,即:
-
非(A 且 B) = (非 A) 或 (非 B)
-
非(A 或 B) = (非 A) 且 (非 B)
看了公式是否有些茫然?為了方便理解,我們來圖解德摩根定律:
-
與: -a ===>且、并集
-
或: -o ===>或、交集
-
非: -not, ! ===>非、補集
邏輯關系基礎:
4. 動作處理
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執行“ ls -l”命令
-delete:刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
其中{} \;是固定格式,
-
{} 用于引用查找到的文件名稱自身
-
\; 結束格式
從示例可知,-ok和-exec實現實現的功能都是一樣的,區別在于-ok會進行交互要求用戶確認,-exec直接操作。
結束語
如你所見,用find命令能夠做很多事情。但find命令還能夠完成更多的操作,所以真應該查看一下man find頁面,或是在互聯網上瀏覽一些相關的優秀教程。find是Linux系統中功能最強大的命令之一,請立即把它用起來吧。
由于初學Linux,限于本人水平有限,文中難免錯誤紕漏。歡迎各位不吝指教、討論相關技術。謝謝。
聯系我:jacky18676887374@aliyun.com
習題作業
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
[root@IP70-CentOS7 ~]# >>find /var -user root -group mail
2、查找/var目錄下不屬于root、lp、gdm的所有文件
[root@IP70-CentOS7 ~]# >>find /var ! \( -user root -o -user lp -o -user gdm \)
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
[root@IP70-CentOS7 ~]# >>find /var -mtime -7 ! \( -user root -o -user postfix \)
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
[root@IP70-CentOS7 ~]# >>find / -atime -7 -nouser -nogroup
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
[root@IP70-CentOS7 ~]# >>find /etc -type f -size +1M -ls
6、查找/etc目錄下所有用戶都沒有寫權限的文件
[root@IP70-CentOS7 ~]# >>find /etc ! -perm /222
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
[root@IP70-CentOS7 ~]# >>find /etc ! -perm -111
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
[root@IP70-CentOS7 ~]# >>find /etc/init.d -perm -113
原創文章,作者:昭其,如若轉載,請注明出處:http://www.www58058.com/36963
一如既往的好,有自己的思考與總結。