find搜索

find

  • find搜索:實時查找工具,通過遍歷指定路徑完成文件查找

    • 工作特點:

         查找速度略慢
        精確查找
        實時查找
        可能只搜索用戶具備讀取和執行權限的目錄
    • find [OPTION]... [查找路徑] [查找條件] [處理動作]

        查找路徑:指定具體目標路徑;默認爲當前目錄
       查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的所有文件
       處理動作:對符合條件的文件做操作,默認輸出至屏幕
  • 查找條件

    • 指搜索層級:

       -maxdepth level 最大搜索目錄深度,指定目錄爲第1級
      -mindepth level 最小搜索目錄深度
    • 根據文件名和inode查找:

       -name "文件名稱":支持使用glob *, ?, [], [^]
      -iname "文件名稱":不區分字母大小寫
      -inum n 按inode號查找
      -samefile name 相同inode號的文件
      -links n 鏈接數爲n的文件
      -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
    • 根據屬主、屬組查找:

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

      find -name snow.png  :搜索名爲snow.png的文件
      find -iname snow.png :不分大小寫地搜索名爲snow.png、Snow.png、SNOW.PNG等等的文件
      find / -name “*.txt”
      find /var –name “*log*”
      find -user joe -group joe :搜索被用戶joe 以及組羣joe所擁有的文件
      find -user joe -not -group joe
      find -user joe -o -user jane
      find -not \( -user joe -o -user jane \)
      find / -user joe -o -uid 500

      找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件

        find /tmp \( -not -user root -a -not -name 'f*' \) -ls
       find /tmp -not \( -user root -o -name 'f*' \) –ls

      排除目錄:示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf後綴的文件

        find /etc -path ‘/etc/sane.d’ -a -prune-o -name “*.conf”
       find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \)-a prune –o name “*.conf”
    • 根據文件類型查找:

      -type TYPE: 
        f: 普通文件  
        d: 目錄文件
        l: 符號鏈接文件  
        s:套接字文件  
        b: 塊設備文件
        c: 字符設備文件
        p: 管道文件
    • 根據文件大小來查找:

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

      以“天”爲單位; 
        -atime [+|-]#,
               #: [#,#+1)
               +#: [#+1,∞]
               -#: [0,#)
        -mtime
        -ctime
      以“分鐘”爲單位:
        -amin
        -mmin
        -cmin
      ##註釋: atime:文件讀取時間
             mtime:文件修改時間
             ctime:狀態修改時間(屬性)
    • 根據權限查找:

      -perm [/|-]MODE
           MODE: 精確權限匹配
           /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係,+ 從centos7開始淘汰
           -MODE:每一類對象都必須同時擁有指定權限,與關係
           0 表示不關注

      示例

         find -perm 755 會匹配權限模式恰好是755的文件
        只要當任意人有寫權限時,find -perm +222就會匹配("+"centos6支持, centos7支持"/")
        只有當每個人都有寫權限時,find -perm -222纔會匹配
        只有當其它人(other)有寫權限時,find -perm -002纔會匹配(用戶和用戶組的0不表示0權限 表示不關注)
    • 組合條件:

      與:-a
      或:-o
      非:-not, !
    • 德·摩根定律:

      (非 A) 或 (非 B) = 非(A 且 B)
      (非 A) 且 (非 B) = 非(A 或 B)
      示例:
        !A -a !B = !(A -o B)
        !A -o !B = !(A -a B)
  • 處理動作

    -print:默認的處理動作,顯示至屏幕
    -ls:類似於對查找到的文件執行“ls -l”命令
    -delete:刪除查找到的文件
    -fls file:查找到的所有文件的長格式信息保存至指定文件中
    -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認
    -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
    {}: 用於引用查找到的文件名稱自身
    find傳遞查找到的文件至後面指定的命令時,查找到所有符合3條件的文件一次性傳遞給後面的命令
  • 參數替換xargs

    • 由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令 xargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成爲arguments

    • 注意:文件名或者是其他意義的名詞內含有空格符的情況 有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決

    • 示例:

      ls f* |xargs rm
      find /sbin -perm +700 |ls -l 這個命令是錯誤的
      find /sbin -perm +7000 | xargs ls –l
      find和xargs格式:find | xargs COMMAND
  • find示例

    find -name “*.conf” -exec cp {} {}.orig \;  備份配置文件,添加.orig這個擴展名
    find /tmp -ctime +3 -user joe -ok rm {} \;  提示刪除存在時間超過3天以上的joe的臨時文件
    find ~ -perm -002 -exec chmod o-w {} \;     在你的主目錄中尋找可被其它用戶寫入的文件
    find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \; data目錄下權限爲644的普通文件找到並修改權限爲755
    find /home –type d -ls 找到並列出家目錄下的目錄文件
  • 練習:

    • 查找/var目錄下屬主爲root,且屬組爲mail的所有文件

      find /var \( -user root -a -group mail \)
    • 查找/var目錄下不屬於root、lp、gdm的所有文件

      find /var -not \( -user root -a -user lp -a -user gdm \)
    • 查找/var目錄下最近一週內其內容修改過,同時屬主不爲root,也不是postfix的文件

      find /var -mtime -7 -not \( -user root -a -user postfix \)
    • 查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

      find -atime -7 \( -nouser -o -nogroup \)
    • 查找/etc目錄下大於1M且類型爲普通文件的所有文件

      find -type f -size +1M
    • 查找/etc目錄下所有用戶都沒有寫權限的文件

      find /etc ! -perm /222
    • 查找/etc目錄下至少有一類用戶沒有執行權限的文件

      find /etc ! -perm -111
    • 查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章