Shell

為什麼我的發現不是遞歸的?

  • December 31, 2018

我正在執行以下命令,但它不是遞歸執行的:

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 的方式(這由nullglobBash 中的選項控制, 例如):

  1. 如果不匹配的 glob 沒有被 shell 擴展,find將(意外地,請注意)表現出正確的行為。
  2. 如果不匹配的 glob 被 shell 擴展為空字元串,find則會抱怨它缺少-name.

引用自:https://unix.stackexchange.com/questions/123440