How to find a file from any directory

First, an argument to -iname is a shell pattern. You can read more about patterns in Bash manual. The gist is that in order for find to actually find a file the filename must match the specified pattern. To make a case-insensitive string book1 match Book1.gnumeric you either have to add * so it looks like this:

find / -iname 'book1*'

or specify the full name:

find / -iname 'Book1.gnumeric'

Second, -iname will make find ignore the filename case so if you specify -iname book1 it might also find Book1, bOok1 etc. If you're sure the file you're looking for is called Book1.gnumeric then don't use -iname but -name, it will be faster:

find / -name 'Book1.gnumeric'

Third, remember about quoting the pattern as said in the other answer.

And last - are you sure that you want to look for the file everywhere on your system? It's possible that the file you're looking for is actually in your $HOME directory if you worked on that or downloaded it from somewhere. Again, that may be much faster.

EDIT:

I noticed that you edited your question. If you don't know the full filename, capitalization and location indeed you should use something like this:

find / -iname 'book1*'

I also suggest putting 2>/dev/null at the end of the line to hide all *permission denied* and other errors that will be present if you invoke find as a non-root user:

find / -iname 'book1*' 2>/dev/null

And if you're sure that you're looking for a single file, and there is only a single file on your system that match the criteria you can tell find to exit after finding the first matching file:

find / -iname 'book1*' -print -quit 2>/dev/null

You may try the locate command. It uses a database of filenames to make searching quicker.

To search for all file matching *book1*, and ignoring case, you could use

locate -i book1

if you want to search for files starting with book1 you will need to do the wildcard yourself:

locate -i 'book1*'

It is much faster than find, but is only as up-to-date as the last time the database was refreshed.


If you know you have a file called book1.something, where the file location, the exact value of something, and the capitalization pattern of the filename are all unknown:

find / -iname 'book1.*'

If all you know for sure is that the filename contains the word book, you can generate a likely much larger list with

find / -iname '*book*'

The argument to -name is a shell glob pattern. From the directory the file is in, compare:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

This represents the kind of search performed by -name. The -iname option simply allows a case-insensitive version of this.