为什么我的查找不是递归的?

为什么我的查找不是递归的?

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

find . -name *.java

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

答案1

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

find . -name '*.java'

解释

如果没有引号,shell 会将其解释*.java为 glob 模式,并将其扩展为与 glob 匹配的任何文件名,然后再将其传递给find.这样,如果您foo.java在当前目录中,find则实际的命令行将是:

find . -name foo.java

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

引用可防止全局扩展并将命令行按find原样传递。

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

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

答案2

我遇到过类似的情况,我将 -name 值放在引号中,但仍然没有获得我希望的所有查找命中。我猜想这是因为符号链接,果然如此。如果您想强制 find 通过符号链接进行搜索,您可以将命令修改为以下内容:

find -L . -name '*.java'

答案3

逃离*

find . -name \*.java

相关内容