find is a very powerful command. After the last post about
grep, in which I mentioned that DOS has a command called “find” which is a simplistic version of
grep, I now feel obliged to tell all about the real (that is, the *nix)
Find works on the basis of
find (from somewhere) (something); the “from somewhere” is often “.” (here, the current directory), or “/” (root, to search the entire filesystem). it’s not terribly interesting. What is interesting, is the “something” bit. You can specify a file name, for example:
$ find / -name "foo.txt" /home/steve/misc/foo.txt $
That wasn’t very exciting, and it will take a long time to complete, too. Systems with “slocate” installed could just say
locate foo.txt and get the answer back in a fraction of a second (by looking it up in a database) ,without trawling through the whole hard disk (or, indeed, all attached disks). So that’s not what’s exciting about
find. What is exciting about
find, is what else it can do, instead of just “-name foo.txt”.
Don’t get me wrong; the “-name” switch is useful. More useful with wildcards:
find . -name "*.txt" will find all text files.
You can restrict the search to one filesystem with the “-mount” (aka “-xdev”) flag.
If you want to find files newer than /var/log/messages, you can use
find . -newer /var/log/messages
If you want to find files over 10Kb, then
find . -size +10k will do the job. To get a full listing,
find . -size +10k -ls.
Want to know what files I own?
find . -uname steve
How about listing all files over 10Kb with their owner and permissions?
$ find . -size +10k -printf "%M %u %f\n" -rwxr-xr-x steve foo.txt -rw------- steve bar.doc -rwxr-xr-x steve fubar.iso -rwxr-xr-x steve fee.txt -rw------- steve jg.tar $
Here, the “%M” shows the permissions (-rwxr-xr-x), “%u” shows the username (“steve”), and “%f” shows the filename. The “\n” puts a “newline” character after each matching file, so that we get one file per line.
There is much more to
find than this; I’ve not really covered the actions (other than printf) at all in this article, just a quick glimpse of how
find can search for files based on just about any criteria you can think of. Search terms can be combined, so
find . -size +10k -name "*.txt" will only find text files over 10Kb, and so on.