Why is my find not recursive?
The problem is, you didn't quote your -name
parameter. Do this instead:
find . -name '*.java'
Explanation
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 find
as-is.
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):
- If a glob that doesn't match is not expanded by the shell,
find
will (accidentally, mind you) exhibit correct behavior. - If a glob that doesn't match is expanded into an empty string by the shell,
find
will complain that it is missing an argument to-name
.
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'