天天看點

Linux檔案搜尋工具--find、locate

檔案查找

                 在檔案系統上查找符合條件的檔案;

                 檔案查找: locate, find

                非實時查找(資料庫查找): locate

                實時查找: find

      1. 非實時查找(資料庫查找): locate

                查詢系統上預建的檔案索引資料庫  (基于此資料庫搜尋)

                資料庫:  /var/lib/mlocate/mlocate.db

              依賴于事先建構的索引

                索引的建構是在系統較為空閑時自動進行(周期性任務),

                管理者手動更新資料庫 :  updatedb

             (建立立的檔案,需要更新資料庫以後才能搜尋到,是以适合查找比較穩的,

            不變的系統内部配置檔案)

              索引建構過程需要周遊整個根檔案系統,極消耗資源

              工作特點:

                 查找速度快

                 模糊查找

                 非實時查找

                 搜尋的是檔案的全路徑,不僅僅是檔案名

                 可能隻搜尋使用者具備讀取和執行權限的目錄

             locate指令

                locate KEYWORD

                常用的選項

                -i 執行區分大小寫的搜尋

                -n N 隻列舉前N個比對項目

                -r   使用正規表達式搜尋

               eg:

                locate foo

                 搜尋名稱或路徑中帶有“ foo”的檔案

                locate -r ‘\.foo$’

                 使用Regex來搜尋以“ .foo”結尾的檔案

    2.實時檔案查找工具: find

             find

                 實時查找工具,通過周遊指定路徑完成檔案查找;

                 工作特點:

                     查找速度略慢

                     精确查找

                     實時查找

                     可能隻搜尋使用者具備讀取和執行權限的目錄

                        目錄搜尋時,自動遞歸搜尋

                 文法:

                 find [OPTION]… [查找路徑] [查找條件] [處理動作]

                    查找路徑:指定具體目标路徑;預設為目前目錄

                       查找條件:指定的查找标準,可以檔案名、大小、類型、

                    權限等标準進行;預設為找出指定路徑下的所有檔案

                    處理動作:對符合條件的檔案做操作,預設輸出至螢幕

                   (注意文法中的格式,應使用正規表達式一緻的文法格式)

            查找條件

                 根據檔案名和inode查找:

                    -name "檔案名稱"(精确搜尋):支援使用glob

                   *, ?, [], [^]   支援通配      –>   注意需要加雙引号

                    -iname "檔案名稱": 不區分字母大小寫

                         -inum n  按inode号查找

                    -samefile name        相同inode号的檔案

                           -links n   連結數為n的檔案

                    -regex "PATTERN":以PATTERN比對整個檔案路徑字

                    符串,而不僅僅是檔案名稱

                 根據屬主、屬組查找:

                    -user USERNAME:  查找屬主為指定使用者(UID)的檔案

                    (注意: 系統是按UID來搜尋的)

                    -group GRPNAME:   查找屬組為指定組(GID)的檔案

                    -uid UserID:  查找屬主為指定的UID号的檔案

                    -gid GroupID:  查 找屬組為指定的GID号的檔案

                    -nouser:      查找沒有屬主的檔案

                    -nogroup: 查找沒有屬組的檔案

                   (多個條件可以直接聯用, 代表與關系,即 -a, -a 可省略 )

                    eg   find / -nouser -nogroup )

                 根據檔案類型查找:

                    -type TYPE:

                     f: 普通檔案

                     d: 目錄檔案

                     l: 符号連結檔案

                     s:套接字檔案

                     b: 塊裝置檔案

                     c: 字元裝置檔案

                     p: 管道檔案

                  組合條件:

                    與: -a

                    或: -o

                    非: -not,   !

                    find / -name "abc.sh" -a -name "bsd"

                    find -not -name "adb"

                 德·摩根定律:

                    (非 P) 或 (非 Q) = 非(P 且 Q)

                    (非 P) 且 (非 Q) = 非(P 或 Q)

                           示例:

                    !A -a !B = !(A -o B)

                    !A -o !B = !(A -a B)

                    12

                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

                排除目錄  -prune  (不搜尋該目錄)

                     示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf字尾的檔案

                    find /etc -path ‘/etc/sane.d’ -a -prune  -o -name “*.conf” -print

                    (忽略/root/bin 目錄, 不對其搜尋,)

                根據檔案大小來查找:

                    -size [+|-]#UNIT  (非精确大小)

                        常用機關: k, M, G

                        #UNIT: (#-1, #]

                        如: 6k 表示(5k,6k]

                        -#UNIT: [0,#-1]

                        如: -6k 表示[0,5k]

                        +#UNIT: (#,∞)

                        如: +6k 表示(6k,∞)

                根據時間戳:

                     以“天”為機關;

                      -atime [+|-]#,

                        #: [#,#+1)    [7,8)

                        +#: [#+1,∞]    [0,7)

                        -#: [0,#)           [8,+無窮)

                      -mtime

                      -ctime

                      以“分鐘”為機關:

                        -amin

                        -mmin

                        -cmin

                 根據權限查找:

                    -perm [/|-]MODE

                    MODE: 精确權限比對

                    /MODE:任何一類(u,g,o)對象的權限中隻要能一位 即可,或關系, + 從centos7開始

                            淘汰

                    -MODE:每一類對象都必須同時擁有指定權限,與關系

                    0 表示此位置上的權限不關注

                         find -perm 755 會比對權限模式恰好是755的檔案(精确比對)

                         隻要當任意人有寫權限時, find -perm +222就會比對

                         隻有當每個人都有寫權限時, find -perm -222才會比對

                         隻有當其它人( other)有寫權限時, find -perm -002才會比對

                        (  +  :   或者關系

                            –  :   并且關系  )

                        find -perm -020   –>  隻有group 上有寫權限的檔案符合處理動作

                     -print:預設的處理動作,顯示至螢幕;  (預設即有輸出)

                     -ls:類似于對查找到的檔案執行“ ls -l”指令

                        注意前面指令是否需要括起來

                     -delete:删除查找到的檔案;

                     -fls file:查找到的所有檔案的長格式資訊儲存至指定檔案中

                     -ok COMMAND {} \; 對查找到的每個檔案執行由

                        COMMAND指定的指令; ( {} 代表搜尋出的檔案 )

                        對于每個檔案執行指令之前,都會互動式要求使用者确認

                     -exec COMMAND {} \; 對查找到的每個檔案執行由 (有風險)

                COMMAND指定的指令

                     {}: 用于引用查找到的檔案名稱自身

                     find傳遞查找到的檔案至後面指定的指令時,查找到所有符合

                    條件的檔案一次性傳遞給後面的指令

                     有些指令不能接受過多參數,此時指令執行可能會失敗,下

                    面方式可規避此問題

                find | xargs COMMAND

                    處理動作

                        xargs -0(零) 換行

                    find示例

                         find -name “*.conf” -exec cp {} {}.org \;

                             備份配置檔案,添加.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 {} \;

                         find /home –type d -ls

                練習

                 1、查找/var目錄下屬主為root,且屬組為mail的所有檔案

                    find /var  -user root -group mail

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

                    find /var -not \(-user root -o -user lp -o -user gdm \)

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

                    find /var -not \( -user root -o -user postfix \) -mtime -7

                 4、查找目前系統上沒有屬主或屬組,且最近一個周内曾被通路過的檔案

                    find \( -nouser -o -group \) -atime -7

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

                    find /etc -size +1M  -type f

                 6、查找/etc目錄下所有使用者都沒有寫權限的檔案

                    find /etc -not -perm /222

                 8、查找/etc/init.d目錄下,所有使用者都有執行權限,且其它

                使用者有寫權限的檔案

                    find /etc/init.d -perm -113

繼續閱讀