I'm looking for shell scripts files installed on my system, but find doesn't work:

$ find /usr -name *.sh

But I know there are a ton of scripts out there. For instance:

$ ls /usr/local/lib/*.sh

Why doesn't find work?

+35  A: 

Try quoting the wildcard:

$ find /usr -name \*.sh


$ find /usr -name '*.sh'

If you happen to have a file that matches *.sh in the current working directory, the wildcard will be expanded before find sees it. If you happen to have a file named tkConfig.sh in your working directory, the find command would expand to:

$ find /usr -name tkConfig.sh

which would only find files named tkConfig.sh. If you had more than one file that matches *.sh, you'd get a syntax error from find:

$ cd /usr/local/lib
$ find /usr -name *.sh
find: bad option tkConfig.sh
find: path-list predicate-list

Again, the reason is that the wildcard expands to both files:

$ find /usr -name tclConfig.sh tkConfig.sh

Quoting the wildcard prevents it from being prematurely expanded.

Another possibility is that /usr or one of its subdirectories is a symlink. find doesn't normally follow links, so you might need the -follow option:

$ find /usr -follow -name '*.sh'
Jon Ericson
+10  A: 

On some systems (Solaris, for example), there's no default action, so you need to add the -print command.

find /usr -name '*.foo' -print
Mark Harrison
I've been bit by that in the past. But I should point out that on a modern Solaris box, -print is on by default. In fact, I can't seem to find a find that doesn't work that way any more.
Jon Ericson

Is there any way to prevent find from digging down recursively into subdirectories?

Brian Warshaw
I asked and answered your question over at: <http://beta.stackoverflow.com/questions/27077/is-there-any-way-to-prevent-find-from-digging-down-recursively-into-subdirector>.
Jon Ericson
+2  A: 

For finding files on your disks, lean to use "locate" instead that is instantaneous (looks into a daily built index) you example would be:

locate '/usr*.sh'

Colas Nahaboo
A fine suggestion. (I had to run updatedb on my machine to test the idea, since I don't have it in my crontab for some reason. Not having an up-to-date database would be the main reason to not use locate.)
Jon Ericson