1. 程式人生 > >find命令的詳細解析

find命令的詳細解析

結果 查找 mod 選項 groupdel sbin 記得 分享 提前

1.find功能
  • 實時查找工具,通過遍歷指定路徑完成文件查找
  • 特點:查找速度略慢 (因為是實時查找,需要經歷每個路徑才能完成查找)
    ???精確查找
    ???可能只搜索用戶具備讀取和執行權限的目錄 (沒有權限無法進行操作)

說到了find這個命令,相應的就會想到locate這個命令
locate這個命令也是具有查找的功能,現在我們來了解一下兩者之間的差別
?locate

  • 非實時查找工具,依據數據庫完成查找
    ?查詢系統上預建的文件索引數據庫
    ???/var/lib/mlocate/mlocate.db
  • 特點:查找速度快 (依據數據庫查找,直接到數據庫的文件路徑中搜尋就可以)
    ???模糊查找
    ???非實時查找 (在系統空閑時更新數據庫或者管理員手動更新,過程極消耗資源,數據無法實時更新)
    ???搜索的是文件的全路徑,不僅僅是文件名
    ???可能只搜索用戶具備讀取和執行權限的目錄
    雖然find和locate這倆個命令都具有查找的功能,但是查找時因為特點有所差別,所以通常使用find來進行查找

2.find命令語法

  • find [OPTION]... [查找路徑] [查找條件] [處理動作]
    ??查找路徑:指定具體目標路徑;不指定則會默認為你所在的當前目錄
    ??查找條件:指定的查找標準,例如可以根據文件名、文件大小、文件類型、文件的權限等標準來進行查找(後面會具體講到)
    ??處理動作:對符合條件的文件進行具體操作,不進行操作則默認輸出至屏幕

    3.find命令選項

    ??現在來具體分析一下有關find這個命令的有關選項


    首先先看一下有關查找條件的選項

  • 搜索層級

         find -maxdepth level      最大目錄深度,指定目錄為第1級
          -mindepth level       最小搜索目錄深度
         搜索目錄深度是相對於當前所在目錄來說的,現在讓我們自己建個目錄和文件來看一下

首先,隨便進入到一個不會影響系統的目錄,我進入到/app下,(將/app裏的所有內容刪除防止影響接下來的結果顯示)然後創建目錄
回顧一下之前學過的mkdir:mkdir -p 創建多級目錄; mkdir -v 顯示創建的具體信息
再創建幾個文件,為了方便識別,所以這樣創建目錄和文件
技術分享圖片
技術分享圖片
好了,現在讓我們敲一下這倆個有關查找目錄深度的文件find命令

技術分享圖片
?看顯示的搜素結果可以知道,-maxdepth 搜索最大目錄深度也就是說你敲5意味著最多只搜索到第5級目錄不會再向下搜索了,第5級目錄是搜索的最終
技術分享圖片
技術分享圖片
?看這次顯示的搜索結果,-mindepth 搜索最小目錄深度也就是說你敲2意味著搜索是從第二級目錄開始的,然後搜索到最後子目錄及子文件


如果我說的這些大白話你還沒有看明白,不要著急,你自己試著創建然後敲一下命令就很容易理解了


  • 文件名

         find -name filename    (支持使用通配符)
         find -iname filename      不區分字母大小寫

用find命令查找文件是可以使用通配符的
好,現在看一下這倆條命令,還是在/app裏,先把之前創建的都刪除,創建幾個名字類似的文件
技術分享圖片


個人覺得這倆條命令很容易理解,所以如果你不理解,還是一樣,敲一下嘍


          find -links n        鏈接數為n的文件

這裏的這個鏈接數指的是硬鏈接,查看鏈接數應該用stat這個命令,之前有提過,所指示的位置就是顯示的文件的硬鏈接數
技術分享圖片
好,這一次我們就不自己創建了,我們直接找一個目錄然後查找看一下,我進入/tmp下
技術分享圖片
來隨意驗證一個文件看是不是硬鏈接數是2
技術分享圖片

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

註意,在這個命令選項裏,匹配的模式。也就是說你想匹配的字符串一定是文件的路徑,支持正則表達
看一下示例
技術分享圖片
藍色框裏的就是錯誤的,錯誤的地方在於字符串模式不是路徑,所以沒有結果而橫線的位置就是想要匹配的正則表達的字符串模式

  • inode號

         find -inum n 按inode號查找
         find -samefile name 相同inode號的文件

回顧一下查看文件的inode號用到的命令是 ls -i ,stat也能查到,在剛才查看的硬鏈接數旁邊就是哦,圈圈出來的就是
技術分享圖片
至於操作跟硬鏈接數的模式是一樣的這裏就不演示了

  • 所屬主、所屬組:

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

現在我們還是進入到/app下,創建三個文件,並且分別把這三個文件的所屬主和所屬組改一下,並且分別刪除一個所屬主和所屬組,先來看一下顯示的結果
技術分享圖片
技術分享圖片
還是先回顧一下之前學過的,修改所屬主和所屬組的時候要確保主和組都存在,不然就要提前先創建,用到了useradd和groupadd;刪除用到了userdel和groupdel,userdel -r 則表示刪除這個用戶所有信息,可一看到,文件的所屬主和所屬組被刪除之後,所對應的位置變成了數字,好了,現在我們敲一下命令看一下顯示的結果
技術分享圖片
可以看到,當你同時搜索所屬組和所屬主的時候,如綠框所示,表示並且的關系,也就是說這個文件的所屬主是liubei,所屬組還需要是maidou才符合搜索的條件,好的,繼續
技術分享圖片
查找所屬主和所屬主的命令就是這樣了,至於那倆個搜索UID和GID的命令選項,就是在選項uid或者gid後面加上你所要搜索的指定的uid數或者gid數就可以了,就不演示了

  • 文件類型

           find -type TYPE:
                              f: 普通文件
                              d: 目錄文件
                              l: 符號鏈接文件
                              s:套接字文件
                              b: 塊設備文件
                              c: 字符設備文件
                              p: 管道文件

好,看到這可能問題來了,就是文件類型從哪裏看呢,那就用到了 ll 這個命令啦,看一下
技術分享圖片
可以看到首先我創建了一個目錄文件,那麽長形框裏就是文件類型啦
技術分享圖片
用法就是這樣的啦

  • 條件組合

     組合條件
          與: -a            或: -o          非: -not, !
     德·摩根定律:
          (非 A) 或 (非 B) = 非(A 且 B)
          (非 A) 且 (非 B) = 非(A 或 B)

這個組合條件前面就已經學過了,所以就當做復習一下可以了,摩根定律個人記憶方法就是括號外和括號裏所表達的意思相反,也就是非或就是且,非且就是或,這個的示例我們跟下面會講到的權限條件合在一起說

  • 根據文件大小來查找

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

這個選項包括下面要說到的時間裏的參數的模式個人認為只能死記硬背了,如果你有更好的方法當然最好了,這個示例就不做了,還要創建指定大小的文件,後面有練習具體看一下就可以了,不難理解只是需要記憶

  • 時間戳

          以“天”為單位;
                 find -atime [+|-]#,
                          #: [#,#+1)
                         +#: [#+1,∞]
                         -#: [0,#)
                  find -mtime
                  find -ctime
           以“分鐘”為單位:
                  find -amin
                  find -mmin
                  find -cmin

這裏回顧一個知識點,atime:access time 文件被訪問改變
??????????mtime:modify time 文件被修改改變
??????????ctime:change time atime或者mtime改變,ctime就改變

  • 權限查找

            find -perm [/|-]MODE
                  MODE:   精確權限匹配
                  /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系, 
                  +MODE   只適用於CentOS7之前的系統
                  -MODE: 每一類對象都必須同時擁有指定權限,與關系
                 0 表示不關註

現在我們把組合條件和權限合到一起看一下,首先我還是進入到/app下,當然裏面的內容已經被我都刪除了,創建幾個文件,然後改一下每個文件的權限,隨便改,看一下每個文件的權限
技術分享圖片
然後我們來根據權限查找文件
技術分享圖片
對照著上面的權限,可以看出,直接敲222,就是精確的匹配權限就是222的文件;前面加/的,則是表示匹配任意一類的用戶有2也就是寫權限的文件就可以,也就是或者的意思;前面加-的,就是表示匹配所有人的都有2也就是寫權限的文件,也就是並且的意思,並且加/和-的匹配是沒有限制的權限不關註就可以了
再看
技術分享圖片
這個則是跟摩根定律一樣的思路了,不是所有人都要有寫的權限,那麽就是任意一類用戶沒有寫權限就可以了,同理,不是任意一類用戶有寫權限,也就是所有人都沒有寫權限

  • 處理動作

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

    ?{} ?用於引用查找到的文件名稱自身
    ?find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令
    看一下
    技術分享圖片
    長形框裏是找到符合條件的文件,隨著綠色箭頭傳遞給了藍色橫線所標記的cp復制的這個命令,而中括號裏所引用的就是長形框裏查找的文件,而這個條命令表達的意思就是備份以.conf為結尾的文件並且後面加個.orig的後綴,所以顯示的結果如粉色圈圈中的一樣
    技術分享圖片
    這條命令要表達的就是刪除/tmp下存在4天或者超過四天的所屬人是joe的文件之前詢問一下,問啥詢問你知道不,因為粉色圈裏的 -ok 啊,執行之前要詢問
    技術分享圖片
    前面我也不記得說沒說過了索性就再說一遍,如果你查找的不是當前目錄下的文件,那麽一定要在find 後面加上你要尋找的文件所在目錄的目錄名,也就是跟紫色雙線一樣,這條命令就是說長列出家目錄下的目錄文件


既然說到了find 這個命令,那我們就順便說一下xargs這個命令,原因是啥呢,因為find 不支持管道 | 來傳遞參數,你看完下面你就知道了他倆的關系了


順便一提

  • xargs產生的緣由:由於很多命令不支持管道|來傳遞參數,而日常工作中經常有這個必要,所以就有了xargs命令
  • xargs作用用於產生某個命令的參數, xargs 可以讀入 stdin 的數
    據,並且以空格符或回車符將 stdin 的數據分隔成為arguments
  • 註意:文件名或者是其他意義的名詞內含有空格符的情況
  • 還有一種情況:參數過多,正常命令是可以執行,但是有些命令不能接受過多參數,命令執行可能會失敗, 就可以用xargs解決這個問題
  • 示例:
    ??ls f* |xargs rm
    ??find /sbin -perm +700 |ls -l 這個命令是錯誤的,find不支持管道 | 傳遞參數
    ??find /sbin -perm +7000 | xargs ls –l
  • find和xargs格式: find | xargs COMMAND

練習1.查找/etc目錄下大於1M且類型為普通文件的所有文件
技術分享圖片
2.查找/var目錄下不屬於root、 lp、 gdm的所有文件
技術分享圖片
查找的文件太多了截不下,湊合看吧,註意藍色橫線標記的,不是或者就是並且


3.查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
技術分享圖片
修改過,所以是-mtime,一周以內就是小於7天,所以是 -7


4.查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
技術分享圖片
都有執行權限,就是-111;其他用戶有寫權限,是-002,因為0表示不關註;相加就是最終查找條件

總結:以上就是有關 find 這個命令的全部解析和相關內容,個人認為很多時候多敲幾遍比看幾遍效果來的要號提案多

find命令的詳細解析