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
command.
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.