Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't **find** find anything?

Tags:

bash

shell

unix

ksh

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
/usr/local/lib/tclConfig.sh  
/usr/local/lib/tkConfig.sh

Why doesn't find work?

like image 393
Jon Ericson Avatar asked Aug 20 '08 21:08

Jon Ericson


1 Answers

Try quoting the wildcard:

$ find /usr -name \*.sh

or:

$ 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'
like image 66
Jon Ericson Avatar answered Oct 04 '22 11:10

Jon Ericson