为什么我的发现不递归?


65

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

find . -name *.java

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


@Gilles:这个问答比骗子要清楚得多,也没有本地化-如果其中一个应该关闭,那就是另一个。
goldilocks 2014年

Answers:


88

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

find . -name '*.java'

说明

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

find . -name foo.java

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

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

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

  1. 如果外壳不扩展不匹配的glob,find将(顺便提醒您)会显示正确的行为。
  2. 如果外壳find将不匹配的glob扩展为空字符串,则会抱怨它缺少的参数-name

20

我遇到过类似的情况,我在引号中使用-name值,但是仍然没有获得我希望的所有查找结果。我猜想这是由于符号链接造成的,而且确实如此。如果要强制查找通过符号链接进行搜索,可以将命令修改为以下内容:

find -L . -name '*.java'

符号链接也是我的问题。-follow是的可读性更高的同义词-L,只要您将其放在其他参数之前即可。
本体

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.