find文件:就是這么簡單

概述


由于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的文件,

wKiom1eyusqy30jNAAAmUF4vbpg278.png

            注意:當我們使用通配符進行查找時,為了防止shell以我們不期望的方式解釋通配符,就必須用引號把搜索內容括起來。

wKioL1ey7l_CFYSmAAAV1amjToo232.png

    -inum N    按 inode 號查找

    -samefile FILENAME    相同 inode 號的文件

    -links N    鏈接數為 n 的文件

wKioL1eyvBzzYErHAAA7B41K30I723.png

    -regex "PATTERN"     以 PATTERN 匹配整個文件路徑字符串,而不僅僅是文件名稱

wKioL1eyvViz2OYDAAAr8iLAbhI554.png

3.2. 根據文件類型查找

    -type TYPE    根據指定文件類型查找文件,支持的文件類型有:

    •  f:  普通文件

    • d:  目錄文件

    • l:  符號鏈接文件

    • s :套接字文件

    • b:  塊設備文件

    • c:  字符設備文件

    • p:  管道文件


wKioL1eyv6CiX-ewAAA5OV2fpIU974.png

3.3. 根據屬主屬組查找

    -user USERNAME     查找屬主為指定用戶 (UID) 的文件
    -group GRPNAME    查找屬組為指定組 (GID) 的文件
    -uid UserID     查找屬主為指定的 UID 號的文件
    -gid GroupID     查找屬組為指定的 GID 號的文件
    -nouser     查找沒有屬主的文件
    -nogroup     查找沒有屬組的文件

wKiom1eyzEvRG67jAACBCMEVCgk442.png

如上圖看到,我們查找的是jacky用戶,為什么出來的是zhaoqi用戶的呢?我們再來看看jacky和zhaoqi的用戶信息:

wKiom1eyzQGQM58xAAAcXmFHMCE658.png

由此我們可以知道,如果用戶名A和用戶B,UID相同,查找用戶A的話,也能找到B用戶的文件,find的用戶查找是從系統角度出發,只認UID的。

3.4. 根據文件大小查找

    -size [+|-]#UNIT    常用單位: k, M, G

文件的大小,以指定數字的話(比如10M),一般有三種情況:大于10M、小于10M和等于10M。為了有助于理解,三種情況可以表示為下圖:

wKioL1eyw5GQo8qpAAA2Kk2DQ0c448.png

wKioL1eyyC6wAFMpAABztkOlUo0172.png

3.5. 根據文件時間戳查找

     以“天”為單位的(#UNIT表示用數字指定的時間)

        -amin [+|-]#UNIT

        -mtime [+|-]#UNIT

        -ctime [+|-]#UNIT

     以“分鐘”為單位的

        -amin [+|-]#UNIT

        -mmin [+|-]#UNIT

        -cmin [+|-]#UNIT

同樣的,相對于指定時間,以7天為例,也有三種情況:小于7天、等于7天和大于七天。同樣便于理解,以-atime為例示圖如下:

wKioL1ey0_jg-QV8AAAmi8euCLU593.png

3.6. 根據權限查找

    -perm [/|-]MODE        (MODE表示以8進制數字表示的用戶權限)

我們先創建如下文件進行權限查找演示:

wKiom1ey2HeQ1hiMAAAq0IHQdjw526.png

我們分別666、-222、/222、/200、-200和400查找:

wKiom1ey2eeCSBjDAABHO1EmKI0529.png

由示例可以看到:

    • -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個文件:

wKioL1ezBmvAyieoAAAmG-D4Xjk113.png

示例一:各條件之間是默認存在-a(與)關系

wKiom1ezvo_xJ-wkAAAYYP8kHes525.png

示例二 :在一般情況下,-a(與) 的優先級高于-o(或),如果需要提高-o(或)優先級,則需要添加 \(  \) 把括起來。

wKioL1ezvwej0uVmAAAhfEEnoOI921.png

wKioL1ezv3mDA-oLAAASt-dj1u0009.png

示例三:包含a字符,并且 不包含b字符的文件,即! A -a ! B = ! \( A  -o B  \)

wKiom1ezwH3SIhWuAAAYkwfqDfc300.png

示例四:包含a字符,或者  不包含b字符的文件,即 A -o ! B = ! \( A  -a B  \)

wKiom1ezwLORq0JTAAAhXf3iwwk439.png

由示例三和示例四可以知道,find多條件間關系是符合德摩根定律的,即:


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

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


看了公式是否有些茫然?為了方便理解,我們來圖解德摩根定律:

    • 與: -a            ===>且、并集

    • 或: -o            ===>或、交集

    • 非: -not, !     ===>非、補集

邏輯關系基礎:

wKiom1ezxEfRzhYtAAIn2FT1meI738.png


wKioL1ezxRKTcZkUAAqwvhGxHWo458.gif

4. 動作處理

    -print:默認的處理動作,顯示至屏幕;
    -ls:類似于對查找到的文件執行“ ls -l”命令
    -delete:刪除查找到的文件;
    -fls file:查找到的所有文件的長格式信息保存至指定文件中
    -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認

    -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令

其中{} \;是固定格式,

    •         {}    用于引用查找到的文件名稱自身

    •         \;    結束格式

wKiom1ezy8Tw_71jAAAnuG_40Eo276.png

從示例可知,-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

1471432296631781.png

2、查找/var目錄下不屬于root、lp、gdm的所有文件

[root@IP70-CentOS7 ~]# >>find /var ! \( -user root -o -user lp -o -user gdm \)

1471432350491914.png

3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件

[root@IP70-CentOS7 ~]# >>find /var -mtime -7 ! \( -user root -o -user postfix \)

1471432526824375.png

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

[root@IP70-CentOS7 ~]# >>find / -atime -7 -nouser -nogroup

5、查找/etc目錄下大于1M且類型為普通文件的所有文件

[root@IP70-CentOS7 ~]# >>find /etc -type f -size +1M -ls

1471433027760038.png

6、查找/etc目錄下所有用戶都沒有寫權限的文件

[root@IP70-CentOS7 ~]# >>find /etc ! -perm /222

1471433142494552.png

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

[root@IP70-CentOS7 ~]# >>find /etc ! -perm -111

1471433310828203.png

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

[root@IP70-CentOS7 ~]# >>find /etc/init.d  -perm -113

1471433518823359.png

原創文章,作者:昭其,如若轉載,請注明出處:http://www.www58058.com/36963

(1)
昭其昭其
上一篇 2016-08-18
下一篇 2016-08-18

相關推薦

  • LAMP 通過使用腳本的方式安裝并部署Discuz

    該腳本有很多輔助的部分,主要是為了讓腳本在中途運行失敗可以多次運行,所產生的結果是預期的,與第一運行并成功的結果是一樣的。初次攝入bash腳本有很多不足,敬請指正。 所需要的軟件 apr-1.5.2.tar.bz2 apr-util-1.5.4.tar.bz2 Discuz_X3.2_SC_UTF8.zip freetype-2.5.4.tar.gz htt…

    Linux干貨 2016-04-05
  • 自制linux與內核編譯

    自制Linux系統 1分區并創建文件系統 fdisk/dev/sdb 分兩個必要的分區 /dev/sdb1對應/boot /dev/sdb2對應根/ mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2 2掛載boot mkdir/mnt/boot mount /dev/sdb1 /mnt/boot ? 3安裝grub grub-i…

    Linux干貨 2016-09-13
  • 馬哥教育網絡班22期-第3周博客作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@zck ~]# who | cut -d ' ' -f1 | sort -u roo root 2、取出最后登錄到當前系統的用…

    Linux干貨 2016-08-30
  • N25-第五周

    一.顯示當前系統上root、fedora或user1用戶的默認shell;    [root@localhost ~]# useradd fedora && useradd user1 && grep "^\(root\|fedora\|user1\)" /etc/passwd | cu…

    Linux干貨 2017-01-09
  • awk的進階

    前言 awk的中有很多的控制語句,awk也支持if語句,while語句,for語句等等編程邏輯充的控制語句及數組、函數。 awk的進階無非就是多練。 1.控制語句 (1)if-else語句 語句格式: if(condition) {statments}    if  (條件) 條件為真 執行{statments} 只有一個語句可…

    Linux干貨 2016-06-26
  • ?Bash2

    字串比較時變量最好使用"" 這樣就不會報錯了,只是退出碼不為0 組合條件:     與:[ condition1 -a condition2 ]或condition1 && condition2     或:[ condition1 -o co…

    Linux干貨 2016-09-25

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 15:15

    一如既往的好,有自己的思考與總結。

欧美性久久久久