为什么我的 find 不是递归的?

use*_*498 79 shell find wildcards

我正在运行以下命令,但它不是递归执行的:

find . -name *.java
Run Code Online (Sandbox Code Playgroud)

我知道当前目录下还有 java 文件,但它find仅在当前目录上执行。我使用的是 OS X 10.9。

Jos*_* R. 105

问题是,你没有引用你的-name参数。改为这样做:

find . -name '*.java'
Run Code Online (Sandbox Code Playgroud)

解释

如果没有引号,shell 会解释*.java为 glob 模式,并在将其传递给find. 这样,如果你有,比如说,foo.java在当前目录中,find的实际命令行将是:

find . -name foo.java
Run Code Online (Sandbox Code Playgroud)

这显然只会列出当前目录中的文件(除非您碰巧在树的下方有一些类似命名的文件)。

引用可防止 glob 扩展并将命令行传递给find原样。

顺便说一句,如果 glob 未能匹配(*.java当前目录中没有文件),您将获得两种行为之一,具体取决于您的 shell 如何设置来处理不匹配的 globs(这由nullglobBash 中的选项控制, 例如):

  1. 如果不匹配的 glob 没有被 shell 扩展,find将(请注意)表现出正确的行为。
  2. 如果 shellfind将不匹配的 glob 扩展为空字符串,则会抱怨它缺少-name.


小智 29

我遇到了类似的情况,我用引号将 -name 值括起来,但仍然没有得到我希望的所有查找命中。我推测这是因为符号链接,果然确实如此。如果要强制查找通过符号链接进行搜索,可以将命令修改为以下内容:

find -L . -name '*.java'
Run Code Online (Sandbox Code Playgroud)

  • 符号链接也是我的问题。`-follow` 是 `-L` 更易读的同义词,只要你把它放在其他参数之前。 (2认同)