Linux 高級文件搜索命令

Linux的查找命令有5個:
        1, find:最常用和最強大的查找命令,可以用它找到任何想找的文件。(迅速在指定的範圍內查找到文件)
        2,which:在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果;
        3,type:用於區分某個命令到底是由shell自帶的,還是由shell外部的獨立二進制文件提供的。如果一個命令是外部命令,那麼使用-p參數,會顯示該命令的路徑,相當於which命令。type命令其實不能算查找命令;
        4,whereis:只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s);

        5,locate:相當於find -name,可快速查找文件

各個命令詳解:

一:find:查找任何文件 (則雞兒強大)
find命令的格式:
    find [PATH] [option] [action]  ###(find [OPTIONS] [查找起始路徑] [查找條件] [處理動作])
find參數:
1,基於文件名的搜索
    與文件名有關的參數:
        find / -name filename: 查找文件名爲filename的文件。filename可使用正則表達式表示。
        find / -iname "PATERN" :不區分名稱字母大小寫
示例:查找所有文件名爲passwd的文件。
[root@176-140-17-46 ~]#  find / -name passwd
/usr/bin/passwd
/etc/pam.d/passwd
/etc/passwd
[root@176-140-17-46 ~]#

2,基於正則表達式的模式查找。
        -regex 同樣屬於測試項。使用-regex時有一點要注意:-regex不是匹配文件名,而是匹配完整的文件名(包括路徑)。
示例:當前目錄下有一個文件"abar9",如果你用"ab.*9"來匹配,將查找不到任何結果,正確的方法是使用".*ab.*9"或者".*/ab.*9"來匹配。 ‘.*’(查找到的文件帶有目錄)
[root@176-140-17-46 opt]# find . -regex ".*ab.*9"
./abar9
[root@176-140-17-46 opt]#

3,基於文件大小的搜索
        -size  測試項根據文件的大小查找文件,文件大小既可以用塊(block)來計量,
        也可以用字節來計量。默認情況下以塊計量文件大小,若想使用字節來計量只需要在數字參數後加c即可。
        與文件大小有關的參數:
            -size SIZE:查找文件大小剛好等於SIZE的文件;
            -size -SIZE:查找文件大小大於SIZE的文件;
            -size +SIZE:查找文件大小小於SIZE的文件。
        其中,size的單位有:
            c —— byte,字節;
            w —— 字(2字節);
            b —— bit,塊(512字節);
            k —— 千字節;
            M —— 兆字節;
            G —— 吉字節。
示例:
    1,查找文件size小於10個字節的文件或目錄
        find ./ -size -10c
    2,查找文件size等於10個字節的文件或目錄
        find ./ -size 10c
    3,查找文件size大於10個字節的文件或目錄
        find ./ -size +10c
    4,查找文件size小於10k的文件或目錄
        find ./ -size -10k
    5,查找文件size小於10M的文件或目錄
        find ./ -size -10M
    6,查找文件size小於10G的文件或目錄
        find ./ -size -10G
    7,搜索大於10KB的文件
        find . -type f -size +10k
8,搜索等於10KB的文件
        find . -type f -size 10k
9,查找超過1M的文件
        find / -type f -size +1M 
10,查找等於6字節的文件
        find . -size 6c

4,基於文件類型的搜索
與文件類型有關的參數:
    -type TYPE:查找文件的類型爲TYPE的文件。
TYPE的參數列表有:
    f :普通文件;
    l :符號連接;
    d :目錄;
    c :字符設備;
    b :塊設備;
    s :套接字;
    p :FIFO。
示例:
   1,查找/var目錄下所有類型爲socket的文件:
        find /var -type s
    2,查找/usr/bin/ 符號鏈接文件 :
        find /usr/bin/ -type l

5,基於目錄深度的搜索
與目錄深度有關的參數:
    -maxdepth n: n爲數字,表示向下最大深度限制爲n;
    -mindepth n: n爲數字,搜索出深度距離當前目錄至少n個子目錄的所有文件。
示例:
        1,查找文件,向下最大深度限制爲3
            find . -maxdepth 3 -type f
        2,搜索出深度距離當前目錄至少2個子目錄的所有文件
          find . -mindepth 2 -type f

6,基於時間進行搜索
與時間有關的參數共有 -atime、-ctime、-mtime。下面以 -mtime 說明:
        -mtime n: n爲數字,列出在n天之前的“一天之內”被更改過的文件名;
        -mtime +n:列出在n天之前(不含第n天本身)被更改過的文件名;
        -mtime -n:列出在n天之內(不含第n天本身)被更改過的文件名;
        -newer file:file爲一個存在的文件,列出比file還要新的文件名。
示例:
    1,查找文件更新日時在距現在時刻二天以內的文件
        find ./ -mtime -2
    2,查找文件更新日時在距現在時刻二天以上的文件
        find ./ -mtime +2
    3,查找文件更新日時在距現在時刻一天以上二天以內的文件
        find ./ -mtime 2
    4,查找文件更新日時在距現在時刻二分以內的文件
        find ./ -mmin -2
    5,查找文件更新日時在距現在時刻二分以上的文件
        find ./ -mmin +2
    6,查找文件更新日時在距現在時刻一分以上二分以內的文件
        find ./ -mmin 2
    7,查找文件更新時間比文件abc的內容更新時間新的文件
        find ./ -newer abc
    8,查找/etc目錄下,所有比/etc/passwd文件更新的文件。
        find /ect -newer /etc/passwd
    9,查找文件訪問時間比文件abc的內容更新時間新的文件
        find ./ -anewer abc
    10,查找從現在開始到24小時前,/etc目錄下所有改動過內容的文件都會被列出來。
        find /etc -mtime 0

7,基於用戶或用戶組名進行搜索
用戶或用戶組名有關的參數:
    -uid n:n爲數字,表示用戶的UID;
    -gid n:n爲數字,表示用戶的GID;
    -user name:name爲用戶賬號名稱;
    -group name:name爲用戶組名;
    -nouser:尋找文件的所有者不存在於/etc/passwd的文件;
    -nogroup:尋找文件的所有用戶組不存在於/etc/group的文件。
示例:
    1,查找root用戶在/home目錄下的所有文件。
        find /home -user root
    2,查找組名爲gname的文件或目錄
        find ./ -group gname
    3,查找屬主被刪除的文件 
        find / -nouser -type f
    4,查找用戶組被刪掉的文件
        find / -nogroup -type f

8,基於文件權限進行搜索
文件權限有關的參數:
    -perm mode:查找文件權限剛好等於mode的文件;
    -perm +mode:查找文件權限“包含任一mode的權限”的文件;
    -perm -mode:查找文件權限“必須要全部包括mode的權限”的文件
示例:
    1,查找權限爲644的文件或目錄(需完全符合)
        find ./ -perm 664
    2,查找用戶/組權限爲讀寫,其他用戶權限爲讀(其他權限不限)的文件或目錄
        find ./ -perm -664
    3,查找用戶有寫權限或者組用戶有寫權限的文件或目錄
        find ./ -perm /220
        find ./ -perm /u+w,g+w
        find ./ -perm /u=w,g=w
    4,查找所有者權限有讀權限的目錄或文件
        find ./ -perm -u=r
    5,查找用戶組權限有讀權限的目錄或文件
        find ./ -perm -g=r
    6,查找其它用戶權限有讀權限的目錄或文件
        find ./ -perm -o=r

9,使用混合查找方式查找文件
參數有: 
    !   不屬於
    -and(-a)  並
    -or(-o)   或者
示例:
    1,在/tmp目錄下查找大於10000字節並在最後2分鐘內修改的文件
        find /tmp -size +10000c -and -mtime +2 
    2,在/目錄下查找用戶是fred或者george的文件文件
        find / -user fred -or -user george
    3,在/tmp目錄中查找所有不屬於panda用戶的文件
        find /tmp ! -user panda

10, 1,查找空文件或空目錄
            find ./ -empty
         2,查找空目錄並刪除
            find ./ -empty -type d -delete
         3,查找空文件並刪除
            find ./ -empty -type f -delete

11,find其他:
       1, 僅僅查找非隱藏的文件(不顯示隱藏文件):

            find . \( ! -regex ".*/\..*" \)


12,清除臨時文件
        1,每個文件掩碼的前面都有 -name. 該列表可以擴展爲包括您需要清除的系統中的任何臨時文件類型。在代碼的編譯和連接過程中,程序員及其工具會生成示例中的那些文件類型:a.out, *.o 和 core. 其他的用戶通常也會生成類似的臨時文件,可以使用如 *.tmp, *.junk等文件掩碼來對命令進行相應的編輯。您可能還發現將命令放入一個稱作 clean的腳本中非常有用,當需要清除一個目錄中的內容的時候就可以執行該腳本。
        find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm -f {} \;

13,維護 LOG 和 TMP 文件的存儲空間
       ,1,要爲生成大量文件的應用程序維護 LOG 和 TMP 文件存儲空間,可以將下列命令放入到每天運行的 cron任務中:
            find $LOGDIR -type d -mtime +0 -exec compress -r {} \;
            find $LOGDIR -type d -mtime +5 -exec rm -f {} \;
            第一個命令找到 $LOGDIR 目錄中所有包含在 24 小時內 (-mtime +0) 進行了修改的數據的目錄(-type d), 對它們進行壓縮 (compress -r {}) 以節省磁盤空間。如果這些目錄超過了一個工作周 (-mtime +5),第二個命令則將其刪除 (rm -f {}),以便增加磁盤上的可用空間。通過這種方式,cron 任務自動地根據您所指定的時間窗口對目錄進行維護。

14,find命令之exec
 exec解釋:
        -exec  參數後面跟的是command命令,它的終止是以;爲結束標誌的,所以這句命令後面的分號是不可缺少的,
    考慮到各個系統中分號會有不同的意義,所以前面加反斜槓。{}花括號代表前面find查找出來的文件名。
示例:
   1, ls -l命令放在find命令的-exec選項中
         find命令匹配到了當前目錄下的所有普通文件,並在-exec選項中使用ls -l命令將它們列出。
         find . -type f -exec ls -l {} \;
    2,在目錄中查找更改時間在14日以前的文件並刪除它們
        find . -type f -mtime +14 -exec rm {} \; 
    3,在目錄中查找更改時間在5日以前的文件並刪除它們,在刪除之前先給出提示
        find . -name "*.log" -mtime +5 -ok rm {} \;
    4,查找文件移動到指定目錄  
        find . -name "*.log" -exec mv {} .. \;,
    5,用exec選項執行cp命令  
        find . -name "*.log" -exec cp {} test3 \;

15,find -exec中使用grep命令
示例:
        find命令首先匹配所有文件名爲“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然後執行grep命令看看在這些文件中是否存在一個root用戶。
        find /etc -name "passwd*" -exec grep "root" {} \;

16,利用管道,

    1,把find命令匹配到的文件名傳遞給xargs命令

find命令配合exec和xargs可以對所匹配到的文件執行幾乎所有的命令。

二,which:查找系統命令位置
which命令的參數:
        -a:將所有由PATH目錄中可以找到的命令均列出來,而不是隻列出第一個被找到的命令。
which命令的格式: which [-a] command
which示例:
        [root@176-140-17-46 ~]# which ifconfig
        /sbin/ifconfig
        [root@176-140-17-46 ~]# 
三,whereis:程序名搜索:
whereis命令的格式:
    whereis [-bmsu] 文件或目錄名
whereis命令的參數:
        -b 只查找二進制格式的文件
        -m 只查找在說明文件manual路徑下的文件
        -s 只招source源文件
        -u 查找不在上述三個選項當中的其他特殊文件
whereis 示例:
        [root@176-140-17-46 ~]# whereis ifconfig
        ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
        [root@176-140-17-46 ~]# whereis -m ifconfig
        ifconfig: /usr/share/man/man8/ifconfig.8.gz
        [root@176-140-17-46 ~]# 
四,locate:利用數據庫查找文件
    locate 不是Linux自帶的命令,如果沒有改命令需要yum 安裝
        安裝:yum  -y install mlocate
    安裝完使用locate定位內容,如果還報如下錯:原因是安裝完後沒有更新庫
        locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
解決辦法:
    更新庫:updatedb   
locate命令的格式:
        locate [-ir] keyword
locate命令的參數:
        -b, --basename         只匹配路徑名的基名
        -c, --count            只輸出找到的數量
        -d, --database DBPATH  使用DBPATH指定的數據庫,而不是默認數據庫 /var/lib/mlocate/mlocate.db
        -e, --existing         只打印當前文件的條目
        -L, --follow           檢查文件是否存在時,跟蹤符號鏈接(默認)
        -h, --help             顯示幫助
        -i, --ignore-case      忽略大小寫
        -l, --limit, -n LIMIT  限制輸出(或計數)以限制條目
        -m, --mmap             忽略,爲了向後兼容
        -P, --nofollow, -H     檢查文件是否存在時,不要跟蹤符號鏈接
        -0, --null             在輸出上有NUL的單獨條目
        -S, --statistics       不要搜索條目,打印關於每個數據庫的統計信息
        -q, --quiet            安靜模式,不會顯示任何錯誤訊息
        -r, --regexp REGEXP    使用基本正則表達式
        --regex            使用擴展正則表達式
        -s, --stdio            忽略,爲了向後兼容
        -V, --version          顯示版本信息
        -w, --wholename        匹配整個路徑名(默認)
locate示例:
        [root@www ~] # locate passwd
        /etc/passwd
        /etc/passwd-
        /etc/news/passwd.nntp
        /etc/pam.d/passwd
五,type:顯示指定命令的類型
type命令格式:
        type [option] [commond]
type命令的參數有:
        -t:輸出“file”、“alias”或者“builtin”,分別表示給定的指令爲“外部指令”、“命令別名”或者“內部指令”;
        -p:如果給出的指令爲外部指令,則顯示其絕對路徑;
        -a:在環境變量“PATH”指定的路徑中,顯示給定指令的信息,包括命令別名。
命令的類型可能有如下幾種:
        alias: 別名;
        keyword: 關鍵字,Shell保留字;
        function: 函數,Shell函數;
        builtin: 內建命令,Shell內建命令;
        file: 文件,磁盤文件,外部命令;
        unfound: 沒有找到。
type示例:
        [root@176-140-17-46 ~]# type date
        date is /bin/date
        [root@176-140-17-46 ~]# type mysql
        mysql is /usr/bin/mysql
        [root@176-140-17-46 ~]# type nginx
        nginx is /usr/sbin/nginx
        [root@176-140-17-46 ~]# type if
        if is a shell keyword
        [root@176-140-17-46 ~]#


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