1. 程式人生 > >Linux find 命令詳解

Linux find 命令詳解

簡介:

    在 Linux 中 find 是一個強大的檔案查詢工具, 可以用於查詢系統或指定目錄的指定檔案, find 支援正則表示式和統配符進行匹配

 

find 命令格式:

# 使用格式
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

格式說明:
    path         find 查詢的路徑, / 表示在當前系統中查詢
    expression   表示式, 預設為 print(將 find 的匹配結果輸出到螢幕)

 

find 引數:

OPTIONS(選項):
    和符號連結相關的選項:
        -P      不跟蹤符號連結(預設行為)
        -L      當 find 檢查或列印有關檔案的資訊時, 所使用的資訊應取自連結指向的檔案的屬性, 而不是連結本身
        -H      和 -L 引數剛好相反,  當 find 檢查或列印有關檔案的資訊時, 所使用的資訊應取自符號連結的屬性
    
        示例:
            # 建立測試環境
            ln -s /etc/ /tmp/

            # 查詢 etc/fstab, 預設 find 命令不會跟蹤符號連結, 所以 find 不會搜尋 /tmp/etc/ 所指向的 /etc/, 這時 find 不會得到的任何內容  
            find /tmp/ -name 'fstab'

            # 查詢 etc/fstab, 使用 -L 選項, find 會搜尋 /tmp/etc/ 所指向的 /etc/ 和其子目錄, 這時可以查詢到 fstab
            find -L /tmp/ -name 'fstab'

            # -H 使用符號連結本身的屬性, 所以 find 將 /tmp/etc/ 當成一個檔案, 這時 find 不會得到的任何內容  
            find -H /tmp/ -name 'fstab'
            
        注意:
            1、-P -L -H 可以同時出現, 但是隻有處於命令列最後的那個引數生效
            2、當 -L 或 -H 生效時, 任何作為 -newer 引數列出的符號連結將被取消引用, 並且時間戳將從符號連結指向的檔案中取出(-newerXY、-anewer、-cnewer 和 -newer 的行為相同)

    除錯和優化:
        -D      除錯模式
        -O      指定優化級別(預設為0)
            0、1        級別 0 和 級別 1 相同, 這是預設的優化級別, 對錶達式進行重新排序, 以便基於 -name 和 -regex 的查詢
            2           對於基於 -type 或者 -xtype 的查詢, 先從 inode 中讀取檔案型別
            3           啟用快速查詢


EXPRESSIONS(表示式):
    OPTIONS(選項):
        -d、-depth              在查詢檔案時, 首先查詢當前目錄中的檔案, 然後再在其子目錄中查詢
        -maxdepth n             find 查詢目錄的最大深度
        -mindepth n             find 從指定的目錄的第幾層深度開始查詢
        -mount                  查詢檔案時不跨越檔案系統的 mount 點
        -follow                 和 -L 引數類似
        -regextype              指定後面所使用的正則表示式語法, 預設為 emacs
            posix-awk               類 awk 的正則表示式語法  
            posix-basic             基本正則表示式
            posix-egrep             不使用正則表示式
            posix-extended          擴充套件正則表示式



    TESTS(測試, 檢查檔案是否符合表示式):
        可以將數字引數指定為:
            +n      大於n
            -n      小於n
            n       等於n
            
        常用引數:
            -anewer file        將指定目錄下的所有檔案和 file 對比, 輸出讀取或寫入時間在 file 讀取或寫入之後的檔案, 該選項會的連結檔案進行跟蹤
            -newer  file        和 anewer 類似, 將指定目錄下的所有檔案和 file 對比, 輸出修改時間在 file 修改之後的檔案, 該選項會的連結檔案進行跟蹤         
            -empty              查詢空檔案或目錄
            -fstype type        查詢指定檔案系統上的檔案     
            -gid n              根據檔案 gid 查詢
            -uid                根據檔案 uid 查詢
            -user               根據屬主查詢
            -group gname        根據檔案屬組查詢
            -name               根據檔名進行查詢
            -iname              和 -name 類似, 但是 -iname 不區分大小寫
            -regex              使用正則表示式進行查詢
            -iregex             和 -regex 類似, 但是 -iregex 不區分大小寫
            -nogroup            查詢沒有屬組的檔案(檔案的屬組列為數字)
            -nouser             查詢沒有屬主的檔案(檔案的屬主列為數字)
            -perm               根據檔案許可權進行查詢
            -readable           查詢可讀檔案
            -writable           查詢可寫檔案
            -path               通常和 -prune 一起使用, 表示忽略某個目錄
            -prune              忽略 -path 指定的目錄, 不能和 -delete、-depth 引數一起使用
            -size n[cwbkMG]     根據檔案大小進行查詢
                b    512 位元組(預設)
                c    1 位元組
                w    2 個位元組的單詞
                k    1 k
                M    1 m
                G    1 g

            -type c
                b      塊裝置
                c      字元裝置
                d      目錄
                p      命名管道
                f      檔案
                l      連結檔案
                s      socket 檔案
            
            和時間查詢相關:
                time 型別介紹:
                    mtime(Change): 當檔案內容傳送改變時更新 mtime
                    ctime(Modify): 當檔案許可權或屬性發生改變時更新 ctime(內容更新時也會更新該值, 和 mtime 唯一區別在於, 當權限或屬性發生改變時 mtime 不會改變)
                    atime(Access): 檔案被訪問時發生改變
                    relatime: 如果一個檔案不停的被訪問每一次都更新 atime 的話將會大大的增加磁碟 IO 的壓力, 所有 Linux kernel 2.6 之後出現了 relatime 屬性
                    使用這個屬性之後只有當 atime 的時間落後 mtime 或者 ctime 之後 atime 才會更新, 在 centos 中想要使用 relatime 必須使用 mount -o relatime 或者在 /etc/fstab 中新增 relatime 引數

                    在 Linux 中使用 stat [file|dir] 可以看見這個幾個值的具體資訊

                -ctime n            檔案狀態最後一次修改是在 n 天之前
                -atime n            檔案最後一次訪問是在 n 天之前
                -mtime n            檔案最後一次修改是在 n 天之前
                -cmin n             檔案狀態最後一次修改是在 n 分鐘之前
                -amin n             檔案最後一次訪問是在 n 分鐘之前
                -mmin n             檔案最後一次修改是在 n 分鐘之前
                

    ACTIONS(對符合表示式的結果進行操作):
        -delete                 刪除查詢到的檔案或目錄(謹用)
        -exec                   將查詢的檔案或目錄傳遞給 exec 後面的 shell 命令作為引數
        -ls                     將查詢到的檔案或目錄傳遞給 ls -l 命令作為該命令的引數
        -ok                     類似於 -exec , 但是在執行命令之前會詢問使用者是否執行
        -print                  預設動作, 將查詢結果輸出的螢幕
        -printf format          類似於 -print, 但是可以自定義輸出格式

  

常用示例:

# 查詢系統中的所有以 .log 結尾的檔案
find / -name "*.log"

# 查詢系統中許可權為 777 的檔案或目錄, 並使用 ls -l 檢視其詳細資訊
find / -perm 777 -ls

# 查詢系統中屬主和屬組為 postfix 的檔案或目錄
find / -user postfix -group postfix

# 刪除 /var/log/ 空檔案和目錄
find /var/log/ -empty -delete

# 使用"擴充套件正則表示式"查詢系統中的所有以.so和.log結尾的檔案
find / -regextype posix-extended -regex ".*\.log$|.*\.so$"

# 檢視 /etc/ 最近三天修改過的檔案
find /etc/ -mtime -3

# 檢視 /etc/ 30天前修改過的檔案
find /etc/ -mtime +30

# 查詢 /var/log/ 所有以 .log 結尾的檔案, 通過 chmod 命令將其許可權改為 666
find /var/log/ -name "*.log" -exec chmod 666 {} \;

# 檢視許可權是否已經更改
find /var/log/ -name "*.log" -ls

# 查詢系統檔案大小大於 10M 的所有檔案
find / -type f -size +10M

# 查詢系統檔案大小小於 1k 的所有檔案
find / -type f -size -1k

# 系統中沒有屬組和屬主的檔案或目錄
find / -nouser -nogroup

# 查詢系統中的 .log 檔案, 查詢深度不超過 3 層
find / -maxdepth 3 -name "*.log"

# 查詢系統中的 .log 檔案, 查詢深度從第 4 層開始
find / -mindepth 4 -name "*.log"