我正在运行以下命令,但它不是递归执行的:
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(这由nullglob
Bash 中的选项控制) , 例如):
- 如果 shell 未扩展不匹配的 glob,
find
将(请注意,意外地)表现出正确的行为。 - 如果 shell 将不匹配的 glob 扩展为空字符串,
find
则会抱怨它缺少-name
.
答案2
我遇到过类似的情况,我将 -name 值放在引号中,但仍然没有获得我希望的所有查找命中。我猜想这是因为符号链接,果然如此。如果您想强制 find 通过符号链接进行搜索,您可以将命令修改为以下内容:
find -L . -name '*.java'
答案3
逃离*
find . -name \*.java