網頁

2013年2月18日

Linux 命令行 Find 小技巧


命令行一直是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用戶用來處理任務的最好工具之一。

转自Ubuntu之家 {原文地址:Linux命令行Find小技巧}

 

-exec 參數

find命令,配合-exec參數,可以對查詢的文件進行進一步的操作,可以得到很多有用的功能,比如說文件包含特定字元串的查詢等,要瞭解這個功能,最簡單直接的就是看find命令幫助,

-exec command ;

Execute command; true if 0 status is returned.   All   following   arguments   to find are taken to be arguments to the command until an  argument  consisting of #;' is encountered.  The string {}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.   Both of these constructions might need to be escaped (with a \') or quoted to  protect   them   from   expansion   by the shell.   The command is executed in the starting directory.

這裡簡單說明一下
-exec 參數後面跟的是 command命令,注意點如下:

command命令的終止,使用 ';' (分號)來判定,在後面必須有一個 ';'

'{}',使用{}來表示文件名,也就是find前面處理過程中過濾出來的文件,用於command命令進行處理

例如:刪除5天前的文件
find /backup/rman/logs -mtime +5 -print -exec rm -f {} \;

 

活用 find 指令參數-atime -Btime -ctime -mtime

-atime 檔案的最後存取時間到find 的執行時間差
-ctime 檔案的狀態資訊最後修改的時間到find 的執行時間差
-mtime 檔案的最後修改時間到find 的執行時間差

我把 -mtime 作為範例說明:
-mtime n[smhdw]
             If no units are specified, this primary evaluates to true if the
             difference between the file last modification time and the time
             find was started, rounded up to the next full 24-hour period, is
             n 24-hour periods. (未指定單位,則進位到下一個24小時,例如 25小時就是第2個24小時)
             If units are specified, this primary evaluates to true if the
             difference between the file last modification time and the time
             find was started is exactly n units.  Please refer to the -atime
             primary description for information on supported time units.(有單位就以單位作運算)

可以用的單位是 s m h d w

範例:

在 7 天前有修改過的檔案,例如今天是6/10,則7天前是6/4
$ find ./ -mtime 7 

在 7 天之內有修改過的檔案,例如今天是6/10,則7天內則是6/4~6/10 的檔案都列出
$ find ./ -mtime -7 

在 7 天以前有修改過的檔案,例如今天是6/10,則7天6/4 以前的檔案都列出
$ find ./ -mtime +7 

在 7 天之內有修改過的檔案,以下三個是同義:
$ find ./ -mtime -7d
$ find ./ -mtime -7
$ find ./ -mtime -1w

Reference

沒有留言:

張貼留言