天天看點

linux 檔案查找

文本查找:grep egrep fgrep

檔案查找:locate、find

locate和find的差別

    locate有自維護的資料庫(linux自建,與所有檔案關聯),每天linux會定時對其進行更新,而locate就在此資料庫中查找,是以查詢速度非常快,但是缺點也很明顯,不能實時查找(比如剛裝linux時這條指令是不能用的),支援的查找方式少。

    find的優點和缺點與locate相對應,find 周遊指定的路徑,用以查找檔案,是以當指定路徑下的檔案數量越多,find的查找效率越低,但是find 支援查找的格式非常多,比如根據檔案名查找,元屬性狀态查找,還支援正則等等。

locate:

    非實時,模糊比對,查找是根據全系統檔案資料庫進行的;

    速度快

        #updatedb,手動生成檔案資料庫

find:

    實時

    精确

    支援衆多查找标準

    周遊指定路徑中的所有檔案進行查找,速度慢

find  查找路徑 查找标準  查找到以後的操作

查找路徑:預設為目前路徑

查找(比對)标準:預設為指定路徑下的所有檔案

處理操作:預設為顯示

比對标準:

    -name ‘filename’:對檔案名進行精确比對

        檔案名通配:

            *:任意長度的任意字元

            ?:單個長度的任意字元

            []:

            ...

    -iname  ’filename‘  比對時忽略大小寫

    -regex pattern  :基于正規表達式對檔案進行比對

               pattern必須用絕對路徑包含

    -user  username:根據屬主查找

    -group groupname:根據屬組查找

    -uid  UID:根據uid查找

    -gid  GID:根據gid查找

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

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

    -type:

        p:普通檔案

        s:socket檔案

        d:目錄檔案

        p:管道檔案

        l:連結檔案

        ...

    -size

        [+|-]#k:查找[大于|小于]#k的檔案

        [+|-]#M:查找[大于|小于]#M的檔案    

        [+|-]#G:查找[大于|小于]#G的檔案

    注意:find 指令裡面查找檔案大小并不是精确的,它會把大于上一個數到小于下一個數之間的數當成目前數,比如我們查找等于10k的檔案,那麼9.2k、9.31k、10.1k等等都會被當成10k而被比對到,而9k 11.1k等就不會

    組合條件:

        -a:與

        -o:或

        -not:非

    -mtime:根據修改(modify)時間

    -atime:通路(access)時間

    -ctime:改變(change)時間

        [+|-]#:+代表某個時間之前,-代表之後,time預設是天

        (atime和ctime差別:atime修改資料,ctime修改元屬性)

    -mmin:

    -cmin:

    -amin:

        [+|-]#:

    與time對應,min代表分鐘

    -perm MODE:完全比對mode,比如755必須完全比對755

        /MODE:部分比對mode,隻要一個比對就可以了,比如r--rw----,隻要這三個位置中其他一個被比對到就可以了,比如可以比對的有:r--------、rw-------等等

        -MODE:完全包含比對,比對的mode必須等于或者可以包含MODE,比如r--rw----,那麼r--rwx---、rw-rw----等可以比對,而---rwxrwx、rwxr-xrwx等不可以比對

find 利用正則比對示例:

[root@logstash ~]# find  /etc/  -regex "\<pas.*"

[root@logstash ~]# find  /etc/  -regex "/etc/\<pas.*"

/etc/passwd

/etc/passwd-

處理操作:

    -print:顯示

    -ls:類似ls -l的格式顯示比對到的檔案的詳細資訊

    -ok COMMAND {} \;每一次操作都需要使用者确認

    -exec COMMAND {} \;

        {}代表比對到的檔案,\;是固定結束符

xargs與find -exec示例

[root@localhost ~]# find  /tmp/ -size -1M   -exec echo {} >>tmp.txt  \;

[root@localhost ~]# cat tmp.txt 

/tmp/mysql.sock

/tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80

/tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030

[root@localhost ~]# find  /tmp/ -size -1M  |xargs echo {} >>tmp1.txt ;

[root@localhost ~]# 

示例:

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

    find /var/  -user root  -group mail 

2、查找/usr不屬于root、bin或student的檔案

    find  /usr/ -not -user root -o -not -user bin -o -not  -user student       

    find  /usr/ -not \(-user root -o  -user bin -o -user student \)

3、查找/etc下最近一周内内容修改過且不屬于root以及student使用者的檔案

   find /etc/ -mtime -7  -not -user root -a  -not  -user student    

   find /etc/ -mtime -7 -not \(-user root -o -user student\)    

4、查找目前系統上沒有屬組或屬主且最近1天内曾被通路過的檔案、并将其屬主屬組修改為root

    find  /  -nouser -o  -nogroup -a -ctime -1 -exec chown  root:root {} \;

5、查找/etc/下大于1M的檔案,并寫入到/tmp/1.txt中

    find  /etc/  -size +1M  -exec echo {} >>/tmp/1.txt \;

6、查找/etc/所有使用者都沒有寫權限的檔案,并顯示其詳細資訊

     find  /etc/ -not -perm /222 -ls

    注意這裡是用/222  而不是-222

本文轉自biao007h51CTO部落格,原文連結: http://blog.51cto.com/linzb/1735061,如需轉載請自行聯系原作者