7.1文件查找之find命令詳解

文件查找:根據文件的各類屬性去找到相對應文件
   
    文本搜索:grep, egrep, fgrep   根據文本內容進行字符匹配查找mysql

    文件查找使用工具:locate, find
    [root@root scripts]#type locate
    locate is /usr/bin/locate
    [root@root scripts]#locate --help
    Usage: locate [OPTION]... [PATTERN]...
    Search for entries in a mlocate database.
        實時查找:遍歷全部文件進行條件匹配
        非實時查找:根據索引查找
        [root@root scripts]#man whatis
        NAME
               whatis - search the whatis database for complete words.
                         在whatis數據庫上搜索完整的單詞
        SYNOPSIS
               whatis keyword ...
       
        DESCRIPTION
               whatis  searches a set of database files containing short descriptions of system com-
               mands for keywords and displays the result on the  standard  output.   Only  complete
               word matches are displayed.
       
               The whatis database is created using the command /usr/sbin/makewhatis.
               使用命令/usr/sbin/makewhatis 建立whatis數據庫。
        [root@root scripts]#whatis ls   whatis查找也是須要數據庫的,是經過makewhatis來建立數據庫的
        ls                   (1)  - list directory contents
        ls                   (1p)  - list directory contents
       
        locate: 非實時查找工具
            特色:須要依賴於索引,而索引構建至關佔用資源;索引的建立是在系統空閒時由系統自動進行(天天任務);手動
            進行使用updatedb命令來建立數據庫;               
                查找速度快
                非精準查找   索引的更新不是實時的
            模糊查找  在基本意義上的匹配查找
            [root@root blankdir]#locate /etc/p*
            。。。。。。。。。。。。。。
            /etc/profile.d/colorls.csh
            /etc/profile.d/colorls.sh
            /etc/profile.d/glib2.csh
            /etc/profile.d/glib2.sh
            /etc/profile.d/lang.csh
            /etc/profile.d/lang.sh
            /etc/profile.d/less.csh
            /etc/profile.d/less.sh
            /etc/profile.d/vim.csh
            /etc/profile.d/vim.sh
            /etc/profile.d/which2.shlinux


        find: 實時查找工具,經過遍歷文件來匹配  
            精準查找
            精確查找sql

            特色:速度慢數據庫

    find [option]... [查找路徑] [查找條件] [處理動做]      隱藏文件也會查找到
    find - search for files in a directory hierarchyexpress

    SYNOPSIS
           find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
   
    DESCRIPTION
           This  manual page documents the GNU version of find.  GNU find searches the directory
           tree rooted at each given file name by evaluating the given expression from  left  to
           right,  according  to the rules of precedence (see section OPERATORS), until the out-
           come is known (the left hand side is false for and operations, true for or), at which
           point find moves on to the next file name.
        查找路徑:默認爲當前目錄
        查找條件:默認爲指定路徑下的全部文件
        處理動做:默認爲顯示至屏幕
        -ls    True;  list  current  file  in  ls -dils format on standard output.
                        列出當前文件像ls -dils格式到標準輸出。由於下面沒有指定查找
                        條件,因此會查找全部文件
  [root@root scripts]#find /var/log/ -ls(不是選項,是一個指定的處理動做)
    524290    4 drwxr-xr-x  10 root     root         4096 Dec 28 03:22 /var/log/
    524685    0 -rw-------   1 root     root            0 Dec 28 03:22 /var/log/maillog
    524303    0 -rw-------   1 root     root            0 Dec  5 23:39 /var/log/tallylog
    。。。。。。。。。。。。。。。。。。
   
    最核心的是查找條件:
        -name "文件名稱":支持使用globbing字符   最經常使用到的  默認查找是區分字符大小寫的
            *:  任意長度的任意字符
            ?:  任意單個字符
            []: 指定範圍的任意單個字符
            [^]: 指定範圍外的任意單個字符  通配符上的元字符
            [!]:指定範圍外的任意單個字符  
            這裏 指定範圍外的任意單個字符 均可以使用,可是隻能在兩邊使用,
            在中間使用時,是無效的。而且在中間的  指定範圍任意單個字符  都是無效的
-----------------------------------------------------
[root@root blankdir]#ls           
fstab  issue  rc.sysinit
[root@root blankdir]#find ./ -name "[??s*]"
[root@root blankdir]#find ./ -name "*[!re]*"
./
./rc.sysinit
./fstab
./issue
[root@root blankdir]#find ./ -name "*[^re]*"
./
./rc.sysinit
./fstab
./issue
[root@root blankdir]#find ./ -name "[!rc]*"
./
./fstab
./issue
[root@root blankdir]#find ./ -name "[^rc]*"
./
./fstab
./issue
[root@root blankdir]#find ./ -name "[^rf]*"
./
./issue
[root@root blankdir]#touch hello
[root@root blankdir]#find ./ -name "*[!s]*"
./
./rc.sysinit
./hello
./fstab
./issue
[root@root blankdir]#find ./ -name "*[^s]*"
./
./rc.sysinit
./hello
./fstab
./issue
[root@root blankdir]#find ./ -name "[^hfi]*"
./
./rc.sysinit
[root@root blankdir]#find ./ -name "[!hfi]*"
./
./rc.sysinit
[root@root blankdir]#ls
fstab  hello  issue  rc.sysinit
[root@root blankdir]#find ./ -name "*!eo"
-bash: !eo": event not found
[root@root blankdir]#find ./ -name "*[!eo]"
./
./rc.sysinit
./fstab
[root@root blankdir]#find ./ -name "*[^eo]"
./
./rc.sysinit
./fstab
[root@root blankdir]#touch h!ol
-bash: !ol: event not found
[root@root blankdir]#touch h\!ol
[root@root blankdir]#ls
fstab  hello  h!ol  issue  rc.sysinit
[root@root blankdir]#touch o^ve
[root@root blankdir]#ls
fstab  hello  h!ol  issue  o^ve  rc.sysinit
[root@root blankdir]#find ./ -name "*[e!]*"
-bash: !]*": event not found
[root@root blankdir]#find ./ -name "*[!e]*"  由於非e後面還跟了*,*是指任意多個任意字符,因此即便前面把e取非後面仍是能夠包含進去的
./
./rc.sysinit
./hello
./o^ve
./h!ol
./fstab
./issue
[root@root blankdir]#find ./ -name "*[^e]*"
./
./rc.sysinit
./hello
./o^ve
./h!ol
./fstab
./issue
[root@root blankdir]#ls
fstab  hello  h!ol  issue  o^ve  rc.sysinit
[root@root blankdir]#find ./ -name "*[vu]*"
./o^ve
./issue
[root@root blankdir]#find ./ -name "*[\!]*"
./h!ol
-----------------------------------------------------           
*****************************************************
find命令在指定字串的中間是取非是有條件的:你必須得知道那個字串的長度,根據指定個數的字符來作匹配就行
[root@root blankdir]#ls hel
heleo  hello  heloo 
[root@root blankdir]#find ./ -name "???[^e]o"
./hello
./heloo
[root@root blankdir]#find ./ -name "???[^el]o"
./heloo
*******************************************************           
            查找以p開頭的全部文件
        [root@root ~]#find /etc/ -name "p*"
        /etc/prelink.cache
        /etc/openldap/certs/password   
     。。。。。。。。。。。。。。。
     查找以p開頭的全部文件,且有一位數字的文件
     [root@root ~]#find /etc/ -name "p*[0-9]*"
        /etc/selinux/targeted/policy/policy.24
        /etc/pki/nssdb/pkcs11.txt
        /etc/polkit-1
        。。。。。
        -iname "文件名稱":查找時忽略字符大小寫vim

        -user USERNAME: 根據文件的屬主查找
        -group GRPNAME: 根據文件的屬組查找
   [root@root ~]#find /home/ -user root
        /home/
        /home/me
        /home/you
        /home/mageedu
        /home/mageedu/.bash_profile
        /home/mageedu/.bash_logout
        /home/mageedu/.bashrc
        [root@root ~]#find /home/ -group root
        /home/
        /home/me
        /home/you
        /home/mageedu
        /home/mageedu/.bash_profile
        /home/mageedu/.bash_logout
        /home/mageedu/.bashrc
        [root@root ~]#find /home/ -group root -ls
        524293    4 drwxr-xr-x  39 root     root         4096 Dec 28 13:26 /home/
        525530    4 drwxr-xr-x   2 root     root         4096 Dec 22 14:24 /home/me
        525529    4 drwxr-xr-x   2 root     root         4096 Dec 22 14:21 /home/you
        525564    4 drwx------   2 root     root         4096 Dec 22 16:44 /home/mageedu
        525565    4 -rw-------   1 root     root          176 Dec 22 16:44 /home/mageedu/.bash_profile
        525566    4 -rw-------   1 root     root           18 Dec 22 16:44 /home/mageedu/.bash_logout
        525567    4 -rw-------   1 root     root          124 Dec 22 16:44 /home/mageedu/.bashrc
chmod 任何用戶均可以使用,chown,chgrp只有管理員才能使用的
        -uid UID
        -gid GID
        [root@root blankdir]#find /home/ -uid 1025 -ls
        525655    4 drwx------   2 1025     1029         4096 Dec 28 13:25 /home/user601
        525656    4 -rw-r--r--   1 1025     1029          176 Oct 16 21:56 /home/user601/.bash_profile
        525657    4 -rw-r--r--   1 1025     1029           18 Oct 16 21:56 /home/user601/.bash_logout
        沒有刪除家目錄,文件格式中是顯示其uid和gid的bash

        -nouser: 查找沒有屬主的文件
        -nogroup: 查找沒有屬組的文件
    [root@root ~]#userdel user5
        [root@root ~]#find /home/ -nouser -ls
        525655    4 drwx------   2 1025     1029         4096 Dec 28 13:25 /home/user601
        525656    4 -rw-r--r--   1 1025     1029          176 Oct 16 21:56 /home/user601/.bash_profile
        525657    4 -rw-r--r--   1 1025     1029           18 Oct 16 21:56 /home/user601/.bash_logout
        525658    4 -rw-r--r--   1 1025     1029          124 Oct 16 21:56 /home/user601/.bashrc
        525540    4 drwx------   2 1002     1003         4096 Dec 21 17:45 /home/user5
        525541    4 -rw-r--r--   1 1002     1003          176 Oct 16 21:56 /home/user5/.bash_profile
        525542    4 -rw-r--r--   1 1002     1003           18 Oct 16 21:56 /home/user5/.bash_logout
        525543    4 -rw-r--r--   1 1002     1003          124 Oct 16 21:56 /home/user5/.bashrcless

        組合條件查找:
            與:-a, 同時知足
            或:-o, 知足一個便可   兩邊要同時判斷再取或   就像數學中的集合概念
            非:-not, !,條件取反ide

            -not A -a -not B = -not (A -o B)  -a是能夠省略的,默認爲與
            -not A -o -not B = -not (A -a B)工具

                例子:-not \( -iname "*r* -o -user gentoo \)
                查找/etc/目錄下的以p開頭且用戶爲root的文件
            [root@root ~]#find /etc -name "p*" -a -user root -ls  -a能夠不用寫的
            131111  128 -rw-r--r--   1 root     root       128669 Dec 23 03:15 /etc/prelink.cache
            133083    4 -r--------   1 root     root           45 Dec  8 20:06 /etc/openldap/certs/password
            135584    4 -rwxr-xr-x   1 root     root         3912 Feb 20  2014 /etc/rc.d/init.d/postfix
            136429    4 -rwxr-xr-x   1 root     root         1556 Jul 17  2012 /etc/rc.d/init.d/psacct
      查找/home下不是root用戶的文件
      find /home -not -user root -ls
    
     -ls在以下狀況會和想像的顯示結果不一樣    注意注意!!!::::::
     [root@root blankdir]#ls -l
            total 28
            -rw-r--r--. 1 root root   863 Dec 29 20:55 fstab
            -rw-r--r--. 1 root root    47 Dec 29 20:55 issue
            -rwxr-xr-x. 1 root root 19914 Dec 29 20:55 rc.sysinit
            [root@root blankdir]#id user
            uid=510(user) gid=1009(hello) groups=1009(hello),1012(me)
            [root@root blankdir]#chown user. issue  默認修改屬組爲hello            
            [root@root blankdir]#ls -l issue
            -rw-r--r--. 1 user hello 47 Dec 29 20:55 issue
            ------------------------------------------------------
            [root@root blankdir]#chown root. issue   屬主和屬組都會改變
            [root@root blankdir]#ls -l issue
            -rw-r--r--. 1 root root 47 Dec 29 20:55 issue
            [root@root blankdir]#chown user issue   用來修改屬主
            [root@root blankdir]#ls -l issue
            -rw-r--r--. 1 user root 47 Dec 29 20:55 issue
            ------------------------------------------------------
            查找含有s且屬主爲root用戶的文件
            [root@root blankdir]#find ./ -iname "*s*" -user root -ls
            401968   20 -rwxr-xr-x   1 root     root        19914 Dec 29 20:55 ./rc.sysinit
            401983    4 -rw-r--r--   1 root     root          863 Dec 29 20:55 ./fstab
            查找含有s且屬主爲user用戶的文件
            [root@root blankdir]#find ./ -iname "*s*" -user user -ls
      401984    4 -rw-r--r--   1 user     root           47 Dec 29 20:55 ./issue
      查找含有r且用戶不是user的文件
      [root@root blankdir]#find ./ -iname "*r*" -a -not -user user -ls
      401968   20 -rwxr-xr-x   1 root     root        19914 Dec 29 20:55 ./rc.sysinit
      查找不含有r且用戶不是user的文件
      [root@root blankdir]#find ./ -not -iname "*r*" -a -not -user user -ls
            399572    4 drwxr-xr-x   2 root     root         4096 Dec 29 20:55 ./
            401983    4 -rw-r--r--   1 root     root          863 Dec 29 20:55 ./fstab
            查找不含有r或者用戶不是user的文件
         [root@root blankdir]#find ./ -not -iname "*r*" -o -not -user user -ls 此時-ls出亂了
            401968   20 -rwxr-xr-x   1 root     root        19914 Dec 29 20:55 ./rc.sysinit
            [root@root blankdir]#find ./ -not -iname "*r*" -o -not -user user
            ./
            ./rc.sysinit
            ./fstab
            ./issue
            [root@root blankdir]#find ./ -not \( -iname "*r*" -a  -user user \)  ()兩邊都須要有空格
            ./
            ./rc.sysinit
            ./fstab
            ./issue
            [root@root blankdir]#find ./ -iname "*r*" -o -not -user user
            ./
            ./rc.sysinit
            ./fstab
            [root@root blankdir]#find ./ -iname "*r*" -o -not -user user -ls
            399572    4 drwxr-xr-x   2 root     root         4096 Dec 29 20:55 ./
            401983    4 -rw-r--r--   1 root     root          863 Dec 29 20:55 ./fstab
           
                
        -type TYPE: 根據文件類型查找
            f: 普通文件
            d: 目錄文件
            l: 符號連接
            b: 塊設備
            c: 字符設備
            s: 套接字文件
            p: 命名管道
        [root@root blankdir]#find /home/ -type d 查找/home目錄下的目錄
        /home/
        /home/user602
        /home/how
        /home/tmpuser7
        /home/user609
        。。。。。。。。。。。。。

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

            #UNIT: #-1 < x <= #   大於#-1小於#
            -#UNIT: x <= #-1    小於等於#-1
            +#UNIT: x > #     大於#的
     [root@root blankdir]#find /var/log/ -size 2k
            /var/log/boot.log
            /var/log/httpd/port_log-20141221
            /var/log/httpd/access_log-20141221
            /var/log/maillog-20141207
            /var/log/mysqld.log
            -rw-------. 1 root  root  1.9K Dec  7 02:15 maillog-20141207
      -rw-r-----. 1 mysql mysql 1.7K Dec 20 12:20 mysqld.log
        根據時間戳查找:
        有兩種方式
            以「天」爲單位
                -atime [+|-]#
                    +#:x >= #+1  在#+1以前被訪問過的文件
                    -#:x < #
                    #: # <= x < #+1
                -mtime
                -ctime

            以「分鐘」爲單位
                -amin
                -mmin
                -cmin

        根據權限查找:
            -perm [+|-]MODE
                MODE: 與MODE精確匹配
                    find ./ -perm 644
                +MODE: 任何一類用戶的權限只要能包含對其指定的任何一位權限便可;以屬主爲例,
                    find ./ -perm +222    任何一類用戶有寫權限的  經常使用+001  +002
                -MODE:每類用戶指定的檢查權限都匹配(能夠是包含關係):   
                    爲三類用戶全部指定的檢查權限都可以被包含
                    find ./ -perm -222

    處理動做:
        -print: 默認處理動做,顯示
        -ls:相似於ls -dils
        -exec COMMAND {} \;  對查找到的文件進行操做  對找到的指定權限的文件修改權限 {}是用來引用文件自己的
        -ok COMMAND {} \;  每個文件在操做以前都須要確認

        find: 一次性查找符合條件的全部文件,並一同傳遞給給-exec或-ok後面指定的命令;但,有些命令不能接受過
        長的參數(文件查找到不少後,處理時會出現問題);此時使用另外一種方式

            對查找到不少的文件進行處理 find | xargs COMMAND
           
     xargs - build and execute command lines from standard input
    
    總結:find [查找路徑] [查找條件] [處理動做]
        查找條件:
            -name, -iname, -user, -group, -uid, -gid, -nouser, -nogroup, -type, -size, -atime, -mtime, -ctime, -amin, -mmin, -cmin, -perm
            組合:-a, -o, -not
        處理動做:
*************************************************************************************
find補充材料(摘自互聯網):


find與xargs
在使用find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec
執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出
現 溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在,特別
是與find命令一塊兒使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不
像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去。

在有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到
的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進程過多,系統性能降低的問題,於是
效率不高;

而使用xargs命令則只有一個進程。另外,在使用xargs命令時,到底是一次獲取全部的參數,仍是
分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來肯定。

*************************************************************************************


練習:
一、查找/var/目錄屬主爲root且屬組爲mail的全部文件;
# find /var -user root -a -group mail

二、查找/usr目錄下不屬於root、bin或hadoop的所用文件;
find /usr -not -user root -a -not -user bin -a -not -user hadoop
find /usr -not \( -user root -o -user bin -o -user hadoop \)

三、查找/etc/目錄下最近一週內其內容修改過的,且不屬於root且不屬於hadoop的文件;
find /etc -mtime -7 -a -not \(-user root -o -user hadoop\)

四、查找當前系統上沒有屬主或屬組,且最近1個月內曾被訪問過的文件;
find / \(-nouser -o -nogroup\) -a -atime -30   優先級是 非  與   或

五、查找/etc/目錄下大於1M且類型爲普通文件的全部文件;
find /etc -size +1M -type f

六、查找/etc/目錄全部用戶都沒有寫權限的文件;
find /etc/ -not -perm +222

七、查找/etc/目錄下至少有一類用戶沒有寫權限;
find /etc/ -not -perm -222

八、查找/etc/init.d/目錄下,全部用戶都有執行權限且其它用戶有寫權限的文件; find /etc/init.d/ -perm -113

相關文章
相關標籤/搜索