命令行一直是Linux用戶用來解決問題的首要選擇。當需要做某件事時,你只要想好如何去做,從那時起你就知道該如何做了。
不過很少有人花些時間系統地了解處理工具在處理過程中的輸入和輸出。因此對於最基本實用工具的功能可能並不是很了解。在本文中,我們將討論所有shell工具箱中都有的一個重要工具:find實用工具。
正如它的名字所表示的,find是在磁盤中查找滿足給定標准的文件和目錄的應用程序。默認情況下,它從當前目錄開始,向下掃描所有子目錄。Find基於各種不同的文件屬性來進行查詢,而且可以對查詢結果執行某種操作,通常是對每個查詢結果運行一些程序。
讓我們來看一些例子:首先,為了在當前目錄或子目錄中查找所有html文件,我們可以使用:find -name "*.html" -type f
該命令有兩個測試條件,第一個,“-name”用於檢驗搜索過程中的每個文件名,如果你需要對大小寫敏感,可以使用“-iname”代替。第二個參數是“-type”,它用於指定你感興趣的文件類型。“f”表示我們查找的是普通文件,我們可以使用“d”表示目錄或使用“l”表示符號連接。在find 手冊中可以看到該工具的所有選項。
在上面的這個例子中,因為我們要在當前目錄中搜索,所以沒有指定路徑。你可以從你的系統中的任何目錄開始搜索,例如,你知道html文件存放在兩個位置之一中,那麼我們就可以通過指定一個開始搜索點使查詢更快更准確。
find /var/www /home/nickg/public_html -name "*.html" -type f
這個查詢從web服務器的根目錄開始,搜索我的html根目錄和它的子目錄,希望能夠得到我們想要的結果,而不是像web浏覽器緩存或html幫助文件。
默認情況下,find遍歷所有子目錄,但是你可以通過指定最大深度來控制這個行為。在前面的例子中,如果我們只想搜索這兩個目錄不想搜索下一層,你可以添加“-maxdepth 1”到命令中。設置最大深度為0表示只檢驗命令行中的給定文件。同樣,你可以設定最小深度,從而避免搜索位於根目錄的文件。
find 的另一個應用是搜索屬於某個給定用戶的文件,因此為了搜索我的系統中所有屬於我的文件,我使用以下命令:find / -user nickg
同樣可以搜索基於組用戶的文件,使用“-group”參數。
另外的測試分類與時間相關,我們可以用基於時間的方式來搜索文件,可以分別使用“-ctime”,“-atime”和“-mtime”參數來指定最後創建時間,最後訪問時間和最後修改時間。例如要搜索前天創建的文件,可以使用:find -ctime -1
注意1前面的“-”表示我們是從今天向以前的日期范圍搜索。如果你需要更精確地搜索,可以使用分鐘變量“-cmin”,“-amin”和“-mmin”。如果你剛犯了一個錯誤但不確定會影響到那些文件,這很簡單可以使用如下查詢:find -mmin -5
find對文件執行的標准行為是顯示出文件名,這就是為什麼如果你跟蹤結果,就會看到一系列文件名的原因。如果你想使用這些結果作為另外一個過濾器的輸入的話,這將會十分有用。但是如果你需要結果的更多信息,你可以令find輸出與ls –l 同樣的結果:
find -user nickg -iname "*.html" –ls
這個命令將會返回文件權限和時間信息。
最後,你可以通過使用“-exec”參數,來讓find命令對每個搜索結果運行任何程序。下面的程序將會刪除你的home目錄中所有擴展名為“.tmp”的文件。
find -name ".tmp" -exec rm {} ;
上面兩個大括號將會被相應的文件名代替,反斜槓用來告訴find何時命令結束。Find常和chmod結合使用快速改變大量文件的文件權限,或者和grep與sed結合使用來選擇性的搜索或使用正則表達式修改文本。這僅是與find相關使用技巧的冰山一角,使用它作為一個腳本的輸入,你可以讓費時的任務自動完成,例如清除一年內沒有訪問的文件,或者自動備份修改的文件。Find的這種強大更能意味著它仍將是linux用戶用來處理任務的最好工具之一。