linux find 命令

zhaoqing0803發表於2013-11-01

    find命令的功能是查詢檔案,但初學者常常覺得其不易使用,這不僅僅是因為它有選項、測試和動作型別的引數,也由於其中一個引數的處理結果可以影響它後續引數的處理。
        在深入研究這些選項、測試和引數之前,先看一個簡單的例子,在本地機器上查詢名為wish的檔案,為了確保我們具備搜尋整個機器的許可權而以root使用者身份來執行此命令:
        #find / -name wish -print
        /usr/bin/wish
        上面命令表示從根目錄開始查詢名為wish的檔案並且輸出檔名。
        需要注意的是:這個命令的執行需要花費很長時間,如果Linux機器掛載(使用SAMBA)了一大塊Windows機器的檔案系統,網路上的Windows機器的硬碟也會高速轉動,看起來似乎是Windows檔案系統也被檢索了,儘管我們知道要查詢的檔案應該在Linux機器上。       
一、選項
        上面例子中的問題通過指定選項-mount就能很好的解決,即告訴find命令不要搜尋掛載的目錄:
        #find / -mount -name wish -print
        這樣我們仍然能找到檔案,但不必再搜尋掛載的其它檔案系統。
        find命令的完整語法格式如下:
        find [path] [options] [tests] [actions]
        path域表示搜尋路徑,可以使用絕對路徑(如:/bin),也可以使用相對路徑(如:.),也可以指定多個路徑(如:find /var /home)。
        options域表示選項,有許多選項可用,但主要選項如下:
        -depth:在檢視目錄本身之前先搜尋目錄的內容。
        -follow:跟隨符號連結。
        -maxdepths N:最多搜尋N層目錄。
        -mount:不搜尋其它檔案系統中的目錄。
       
二、測試
        可以提供給find命令的測試非常多,每種測試返回的結果有兩種可能:true或false。find命令開始工作時,按照順序將定義的每種測試依次應用到它搜尋到的每個檔案上。如果一個測試返回false,find命令就停止處理它當前找到的這個檔案,並繼續進行搜尋。如果一個測試返回true,find命令將繼續進行下一個測試或對當前檔案採取行動。下面是最常用的測試,更多測試參考find命令使用手冊:
        -atime N:檔案在N天之前被訪問過。
        -mtime N:檔案在N天之前被修改過。
        -name pattern:檔名(不包括路徑名)匹配提供的模式pattern,為了確保pattern被直接傳遞給find命令而不是由shell來處理,pattern必須總是用引號括起。
        -newer otherfile:檔案比otherfile檔案要新。
        -type c:檔案的型別為C,C可以是一個特殊型別。最普通的型別是d(目錄)和f(普通檔案)。其它可用的型別請參考使用手冊。
        -user username:檔案的擁有者是指定的使用者username。
        還可以用操作符來組合測試,大多數操作符有兩種格式:短格式和長格式:
        短格式         長格式        含義
        !                 -not            測試取反
        -a                -and            兩個測試都必須為真
        -o                -or              兩個測試之一必須為真
        可以通過使用圓括號來強制測試和操作符的優先順序。由於圓括號對shell來說有其特殊的含義,所以我們還必須使用反斜線來引用圓括號。此外,如果在檔名處使用的是匹配模式,就必須在模式上使用引號,以確保模式沒有被shell擴充套件,而是直接傳遞給find命令。如果想寫一個測試,即搜尋的檔案比檔案X要新,或者檔名以下劃線開頭,就可以這樣寫這個測試:
        \(-newer X -o -name "_*" \)

       -----括號後要有空格

        如果要在當前目錄下查詢以下劃線開頭的檔案或比while2檔案要新的檔案,可以如下來寫這個測試:
        $find . \( -name "_*" -o -newer while2 \) -type f -print

        -----括號後要有空格
        
三、動作
        實際上,搜尋到匹配指定條件的檔案之後,還可以執行一些動作,常見的動作如下,更多動作資訊參看find命令的使用手冊:
        -exec command:執行一條命令。
        -ok command:與-exec類似,但它在執行命令之前會針對每個要處理的檔案,提示使用者進行確認。
        -print:列印檔名。
        -ls:對當前檔案使用命令ls -dils.
        -exec和-ok命令將命令列上後續的引數作為它們引數的一部分,直到被\;序列終止。魔術字串{}是-exec或-ok命令的一個特殊型別的引數,它將被當前檔案的完整路徑取代。
        下面舉例說明如何使用ls命令:
        $find . -newer while2 -type f -exec ls -l {} \;
        -rwxr-xr-x    1    scq    scq    256    Feb    8    17:07    ./test
        -rwxr-xr-x    1    scq    scq    257    Feb    8    17:08    ./hello
        -rwxr-xr-x    1    scq    scq    258    Feb    8    17:09    ./world

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23205405/viewspace-775531/,如需轉載,請註明出處,否則將追究法律責任。

相關文章