My Favorite Linux Commands: find

December 14, 2008


Over the next week or so (as time allows), I’ll attempt to write a short summary of my favorite Linux commands. These are commands that I use regularly and make my life a lot easier. Hopefully, they’ll make your life easier too. Up first, the find command.

Not surprisingly, you can use the find command to locate files (and other things ;-)). What is surprising is the large number of options that you can set to find exactly the file(s) that you are looking for, and take action on them.

Let’s say that I have a directory called “sale” with JPEG files in it that have differences in their file extension (i.e, some were saved as *.jpg, and some as *.JPG) and their permission settings. I’d like to know how many of each I have, and then I’d like to change the permissions on a subset of them, to make those that are currently not readable by the “other” group readable.

First, lets see how many files are in the directory:

$ find sale/ -type f -iname "*.jpg"<br /> sale/P9130285.JPG<br /> sale/P9130286.JPG<br /> sale/P9130287.JPG<br /> sale/P9130288.JPG<br /> sale/P9130289.JPG<br /> sale/P9130290.JPG<br /> sale/P9130291.JPG<br /> sale/phone_1.jpg<br /> sale/phone_2.jpg<br /> sale/phone_3.jpg<br /> sale/phone_4.jpg<br /> sale/phone_5.jpg

Like other Linux commands, you can direct the output of find into another command to get a summary count of all the files located:

$ find sale/ -type f -iname "*.jpg" | wc -l<br /> 12

In the above example, I use the -type option and the -iname option to list all files with a .jpg extension (regardless of case). Not surprisingly, using the -name option applies a similar, but case sensitive, pattern match on file names:

$ find sale/* -type f -name "*.jpg"<br /> sale/phone_1.jpg<br /> sale/phone_2.jpg<br /> sale/phone_3.jpg<br /> sale/phone_4.jpg<br /> sale/phone_5.jpg

There are a large number of options that can be used, and the real power of this command comes from a thorough understanding of them. One of the most useful, in my opinion, is the -exec option. This option lets you do something specific with each file that is found. To change the permissions on all files with a case sensitive “.jpg” extension and make the files readable by the “other” group, you could use the following:

find sale/* -type f -name "*.jpg" -exec chmod o+r {} ;

The -exec option lets you specify another command that is run on each file found (represented by the {} argument). Note, you also need to end the command issued by -exec with an escaped semicolon. Using the find command in this way can be enormously helpful for doing things like clearing out old log files. I typically use find in a cron job that searches directories for log files older than a certain amount of time (using the -mtime option) and then deletes them from the directory:

find logs/ -type f -name "*log*" -mtime +30 -exec rm {} ;

If you’re like me you will probably have an arsenal of commands that you use on a regular basis, to quickly and easily do the things that you do almost every day. Having the find command in your arsenal can make life a lot easier.