關于 find 命令的15個超級有用的例子
find 命令用于在 Linux 命令行中搜索文件和目錄。
find 是功能最強大、使用最頻繁的命令之一,同時也是選項最多的命令之一,它有50多個選項,很容易讓人弄混了,特別是當它與 exec 或 xargs 命令一起使用的時候。
作為系統管理員或者軟件開發者,在命令行中工作時都不可避免的會使用到 find 命令。所以,與其畏難而逃避它,不如知難而進,擁抱它的力量。
本文我們會分享關于 find 命令的一些常見示例。不過在此之前,我們先來看一下它的語法,以及如何使用。
Linux 中的 find 命令
find 命令的一般語法為:
方括號 [] 中所有的內容都是可選的,這意味著你可以在沒有任何選項和參數的情況下運行 find 命令。不過這只會打印出當前路徑下所有的文件和目錄,這樣沒什么用處,對吧?
我們來詳細了解一下它的參數。
- directory to search:要搜索的目錄,基本上就是我們要開始搜索的位置。默認情況下,搜索是遞歸的(也會搜索子目錄),從當前位置開始;
- options:選項,指定搜索的類型,可以按文件名稱、文件類型、修改時間等(進行搜索),這里有50多個選項;
- expression:指定的搜索詞。如果是要按文件名查找,那么搜索詞就是文件名;如果是要查找名稱與表達式匹配的文件,那這里就用表達式。
看下面的例子:
該命令將在當前目錄及其子目錄中進行搜索,查找名為 myfile 的文件(不是目錄)。選項 -type f 表示只查找文件,單點 . 表示當前目錄。
按名稱查找文件和目錄
可以按文件名搜索文件和目錄:
由于沒有指定文件類型,所以它會搜索具有給定名稱的文件和目錄。
下面的例子找到名為 mystuff 的文件和目錄:
只查找文件或目錄
如果只想查找文件,那么需要指定文件類型 -f:
類型和名稱的順序無關緊要。上一個例子中,只查找文件,可使用如下命令:
如果只搜索目錄,那么指定類型 -d:
還是上面那個例子,如果只查找目錄,使用如下命令:
執行不區分大小寫的搜索
默認情況下,find 命令區分大小寫。如果我們想要執行不區分大小寫的搜索,可以使用 -iname 來代替 -name:
也可以將其與 -d 選項一起使用。
按擴展名搜索(重要)
find 命令最常見的用法之一就是查找指定類型的文件,或者說是按照文件擴展名來進行查找。
比如,我們要在當前目錄下搜索所有的 C++ 文件,而C++文件的擴展名是 .cpp,所以我們可以這樣搜索:
這樣,我們告訴 find 命令查找類型為文件(file),并且以 .cpp 結尾的文件。
注意:在使用 find 命令時,需要將表達式放在雙引號中。
為什么要將表達式放在雙引號中呢?因為如果要不這樣做的話,shell會擴展通配符,將其替換為當前目錄中所有以 .cpp 結尾的文件。
比如,假如當前目錄下有兩個文件:file1.cpp, file2.cpp,那么下面的命令:
會被shell擴展為:
這種情況下,shell 就會給出提示:
另外,如果當前目錄下只有一個擴展名為.cpp的文件,那就可以。
搜索多個擴展名(或條件)的多個文件
上述命令搜索給定擴展名的文件。那如果要同時搜索不同擴展名的文件,該怎么辦呢?
可以使用邏輯或(OR) -o 來運行 find 命令:
這樣,就會搜索擴展名為 .cpp 或 .txt 的文件:
在指定目錄中查找文件
我們上面的例子都是在當前目錄中搜索,因為我們在命令中指定了 . 作為當前路徑。
點 . 可以替換為絕對路徑或者相對路徑。這樣我們就可以在不離開當前路徑的情況下,在指定的目錄中查找文件。
在多個目錄中搜索文件
如果你認為所要查找的文件可能位于多個位置,那么不必多次運行 find 命令,只需在 find 命令中指定要搜索的所有目錄路徑即可:
查找空文件和目錄
-empty 選項可以讓你使用 find 命令查找空文件和目錄。比如要查找當前路徑下所有的空文件和目錄,可使用如下命令:
也可以指定搜索的文件類型,只查找文件或者目錄:
還可以結合文件名使用:
查找大文件或小文件(根據文件大小搜索)
根據文件的大小執行搜索,可以查找大文件或者小文件。但這只適用于文件,不適用于目錄。
要根據文件的大小搜索,可以使用 -size 選項,后面跟上一個值N(即文件的大小),+N 查找大于 N 的文件,-N 查找小于 N 的文件。
比如,查找大小正好為 50KB 的文件:
在當前路徑下查找大于 1G 的文件:
查找小于 20 bytes 的文件(注意單位是c而不是b):
要查找大于100 MB 但小于 2 GB 的文件:
此外,還可以結合名稱搜索。比如,要在根目錄中查找以 .log 結尾,大于500MB的文件,可使用如下命令:
關于文件大小值 N 的單位:
- c : bytes(字節)
- k: kilobytes(千字節)
- M: Megabytes(兆字節)
- G: Gigabytes(GB)
查找最近修改的文件(根據修改或創建時間搜索)
我們先來簡單介紹下mtime, atime 和 ctime 的概念:
- mtime:文件上次修改的時間;
- ctime:文件創建的時間;
- atime:文件上次訪問的時間。
我們經常會有查找最近修改過的文件的需求,這時候,可以按修改時間來搜索文件。
比如,要查找 3天(3 * 24H)以內修改過的所有文件:
再比如,查找 5天以前創建的文件:
上述命令是以天為單位。那么,如果要搜索幾分鐘前修改過的文件呢?可以使用 mmin, amin 和 cmin。
比如,要查找 5分鐘以內修改過的文件,可使用如下命令:
此外,還可以結合名稱,指定時間的上限和下限進行搜索。比如,下面的命令將搜索過去20分鐘到30分鐘內,修改過的所有 .java 文件:
查找具有特定文件權限的文件
find命令允許您搜索具有特定權限的文件。
比如,在當前路徑下查找所有權限模式為 777 的文件:
查找具有讀寫權限的文件(完全匹配,如果文件權限為 讀寫和執行,則不匹配):
根據文件的所屬用戶查找
find 還可以根據文件的所有權進行搜索。
比如,在當前路徑下搜索用戶 John 所擁有的文件:
當然,也可以與其他選項(比如文件大小,時間,名稱等)結合使用:
不遞歸查找,僅在當前目錄中搜索
默認情況下,find 命令在當前位置的所有子目錄中搜索。如果不希望這樣,可以將搜索深度指定為 1。這將限制搜索僅限于當前目錄,不包括任何子目錄。
從搜索中排除目錄
如果要將某個目錄從搜索中排除,可以結合 -path, -prune 和 -o 一起使用:
注意路徑中的星號 *, -prune 選項在路徑之后,-o 選項在 prune 之后。
基本上,prune命令要求不使用路徑指定的值,它總是與 -o 一起使用,以確保 -o 的右側只針對未被排除的目錄。
處理 find 命令的輸出結果(使用 exec 和 xargs)
到目前為止,我們介紹了關于find命令的一些標準查找文件的方法。此外,還可以通過對 find 命令的結果執行某些操作,來改進它。
例如,查找與特定名稱模式匹配的文件并一次性重命名,或者查找空文件并刪除。
我們知道,管道重定向可以用于將一個命令的輸出與另一個命令輸入相結合。但這對find命令的輸出不起作用,至少不直接起作用。
如果要對find命令的結果執行操作,有兩個選項,即 exec 和 xargs。
使用 find 和 exec
假如我們要對 find 的結果使用 ls -l 列出來,看下面的例子:
以下是輸出:?
不要忘記 exec 命令最后的 {} +,并且要注意 {} 和 + 之間的空格。
花括號 {} 引用 find 命令的結果,你可以將其認為是 {file1, file2, file3}。加號 + 用于終止 exec 命令。
exec 還有另一個約定:
上述命令中,分號 ; 用于代替加號 +,分號前面的反斜杠 \ 用于轉義特殊字符。
{} + 的優點是它運行的命令更少,它就相當于是 ls -l file1 file2 file3;而 {} \ 則相當于運行 ls -l file1, ls -l file2, ls -l file3。
但是,{} \;具有在同一 exec 語句中多次使用 {} 的優點。例如,下面的命令將使用 .old 擴展名重命名所有找到的文件:
使用 xargs
許多 Linux 用戶已經習慣了管道重定向。這個帶有尾隨 { }+ 的 exec 命令對他們來說似乎不太習慣。
這就是 xargs 命令存在的價值,你只需要通過管道將 find 命令的輸出解析到 xargs 命令:
find 結合 grep 使用
上面我們介紹了 find 結合 exec 和 xargs 命令的使用,此外,還可以將 find 與 grep 命令一塊使用。
對于任何系統管理員或軟件開發人員來說,find 和 grep 是最常見且最有用的組合之一。
你可以使用 find 命令來查找文件,然后使用 grep 命令來搜索這些文件的內容。
比如,我們要搜索所有包含 “Alice”一詞的 txt 文件,那么可以這樣搜索:
同樣的,也可以使用 xargs 命令:
當然,這是最簡單的例子,如果你熟悉 grep 命令,可以根據自己的需求和喜好使用它。
find 命令的用法還有很多,我們列舉了一些相對比較常用的。當你開始熟悉 find 命令的時候,就可以在各種情況下使用。