Shell
為什麼我的發現不是遞歸的?
我正在執行以下命令,但它不是遞歸執行的:
find . -name *.java
我知道目前目錄下還有 java 文件,但它僅
find
在目前目錄上執行。我正在使用 OS X,10.9。
問題是,你沒有引用你的
-name
參數。改為這樣做:find . -name '*.java'
解釋
如果沒有引號,shell 將解釋
*.java
為 glob 模式,並將其擴展為與 glob 匹配的任何文件名,然後將其傳遞給find
. 這樣,如果您foo.java
在目前目錄中有,find
的實際命令行將是:find . -name foo.java
這顯然只會列出目前目錄中的文件(除非您碰巧在樹的下方有一些名稱相似的文件)。
引用可防止全域擴展並將命令行按
find
原樣傳遞。順便說一句,如果 glob 無法匹配(
*.java
目前目錄中沒有文件),您將獲得兩種行為之一,具體取決於您的 shell 設置為處理不匹配的 glob 的方式(這由nullglob
Bash 中的選項控制, 例如):
- 如果不匹配的 glob 沒有被 shell 擴展,
find
將(意外地,請注意)表現出正確的行為。- 如果不匹配的 glob 被 shell 擴展為空字元串,
find
則會抱怨它缺少-name
.