I am running the following command, but it is not performed recursively:
find . -name *.java
I know there are java files further down in the current directory but it is performing the
find on the current directory only. I am using OS X, 10.9.
Stack Exchange network consists of 181 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers.Visit Stack Exchange
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.Sign up to join this community
The problem is, you didn't quote your
-name parameter. Do this instead:
find . -name '*.java'
Without the quotes, the shell interprets
*.java as a glob pattern and expands it to any file names matching the glob before passing it to
find. This way, if you had, say,
foo.java in the current directory,
find's actual command line would be:
find . -name foo.java
which would obviously list the file in the current directory only (unless you happen to have some similarly-named files further down the tree).
Quoting prevents glob expansion and passes the command line to
Incidentally, if the glob had failed to match (no
*.java files in the current directory), you would get one of two behaviors depending on how your shell is set up to handle globs that don't match (this is governed by the
nullglob option in Bash, for example):
findwill (accidentally, mind you) exhibit correct behavior.
findwill complain that it is missing an argument to
I had a situation similar where I was surrounding the -name value in quotes, but still wasn't getting all of the find hits that I was hoping for. I conjectured that it was because of symlinks and sure enough that was the case. If you want to force find to search through symlinks you can modify the command to the following:
find -L . -name '*.java'
-followis a more readable synonym for
-L, as long as you put it before the other params.
find . -name \*.java