Linux find 命令詳解

簡介:node

    在 Linux 中 find 是一個強大的文件查找工具, 能夠用於查找系統或指定目錄的指定文件, find 支持正則表達式和統配符進行匹配python

 

find 命令格式:正則表達式

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

格式說明:
    path         find 查找的路徑, / 表示在當前系統中查找
    expression   表達式, 默認爲 print(將 find 的匹配結果輸出到屏幕)

 

find 參數:shell

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'
            
        注意:
            一、-P -L -H 能夠同時出現, 可是隻有處於命令行最後的那個參數生效
            二、當 -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, 可是能夠自定義輸出格式

  

經常使用示例:express

# 查找系統中的全部以 .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"
相關文章
相關標籤/搜索