Friday, March 18, 2011

find command is one of the versatile command in UNIX and Linux and I used it a lot in my day to day work. I believe having knowledge of find command in UNIX and understanding of its different usage will increase your productivity a lot in UNIX. If your works involve lots of searching stuff on Linux machine or if you are a java or C++ programmer and your code resides in UNIX, find command can greatly help you to look for any word inside your source file in the absence of an IDE, It is the alternative way of searching things in UNIX. grepis another Linux command which provides similar functionality like find but in my opinion later is much more powerful than grep in UNIX. Like any other command strength of find is lies in its various options, which is worth learning, but to be frank hard to remember. If you can even able to remember all options mentioned in this article, you will be taking more advantage of find, than average developers and Linux users. If you love to read books, you can also take a look at A Practical Guide to Linux Commands, Editors, and Shell Programming (2nd Edition) By Mark G. Sobell, a great book and must read for any system administrator, security guy or developers, who works in UNIX based environment. It not only teaches about find and grep, but also several useful commands, which probably gone unnoticed by many of us

By the way, I have been sharing my experience on Unix and Linux command and its different options, usage and example and this article is in continuation of my earlier post like How to convert IP address to hostname in Linux. If you are new here you may find those tips useful for your day 2 day development and support work.

10 Tips on find command in UNIX

Here I am listing down some of the way I use find in Unix or Linux box regularly, I hope this would help some one who is new in UNIX find command or any developer who has started working on UNIX environment. this list is by no means complete and just some of my favourites , if you have something to share please share via commenting.

How to run last executed find command in Unix – Example 1

!findwill repeat the lastfindcommand executed. It saves lot of timeif you re searching for something and you need to execute same command again and again. In fact "!" can be used with any command to invoke previous run of that command.

How to find files which has been modified less than one day, minute or hour in Unix:

find -mtime is used to search files based upon modification time. This is infact my favorite find command tips while looking out some production issues just to check which files have been modified recently, could be likely cause of issue, believe me it helps a lot and many a times gives you enough hint of any problem due to intended or unintended file change. Along with –mtime, there are two more options related to time, find -atime which denote last accessed time of file and find –ctime denotes last changed time. + sign is used to search for greater than, - sign is used to search for less than and without sign is used for exact. For example find –mtime -1 will search all files which has been modified

In this example since we have only modified StockTrading.java some time back it has shown on find –mtime -1, rest of files are not touched today so they are appearing as modified more than 1 day while there is no file which has been modified exactly one day.

How to find all the files and directories which holds the 777 permission in Unix box – Exmaple 3

find –perm option is used to find files based upon permissions. You can used find –perm 444 to get all files which allows read to owner, group and others. If you are not sure how those 777 and 444 numbers comes up, see my post on file and directory permission in Unixand some chmod examples to change permissions in Unix.

I use this find command example to find out all the executable files, you can also modify it to find all the read only files or files having write permission etc by changing permissions e.g. to find all read only files in current directory : find . –perm 555Here "." or period denotes current directory. You can replace it with any directory you want.

Example 4 – Case insensitive search using find in Unix

How to do case insensitive search using find command in Unix? Use option “-i" with name, by default find searches are case sensitive. This option of find is extremely helpful while looking for errors and exceptions in log file.

find . –iname "error" –print ( -i is for ignore )

On a different notefind and grep command is also a favorite topic during Unix interview and interview often asked questions during interviews on both system admin and application developer jobs.

UNIX find command and xargs Example

Now we will see some UNIX find command example combined with xargs command, xargs can be used to do whatever witch each file found by find command for example we can delete that file, list content of that file or can apply any comment on that file.

Example 5 - How to delete temporary files using find command in Unix?

In order to delete files you can use either –delete option of find command or use xargs in combination. Its better to create house keeping script for such task which can perform cleanup on periodic basis.

find . -name"*.tmp"-print|xargsrm –f

Use of xargs along with find gives you immense power to do whatever you want with each search result. See another example below , also its worth considering use of -print0 to avoid problems with white space in the path when piping to xargs (use with the xargs -0 option) as suggested by Ebon Elaza.

Example 6 - How to find all text file which contains word Exception using find command in Unix ?

find . –name "*.java" –print | xargs grep “MemoryCache”, this will search all java files starting from current directory for word "MemoryCache". we can also leave -print option in all cases because its default for UNIX find command as pointed out by Ben in comments. You can further sort result of find command using Sort command in unix.

find . –name "*.txt" –print |xargsgrep"Exception"

Example 7 - Finding files only in current directory not searching on sub directories:

While using find command I realized that some time I only need to find files and directories that are new , only in the current directory so I modified the find command as follows. –type option can be used to specifiy search for only file, link or directory and maxdepth specifies how deep find has to search.

find . -maxdepth1-type f -newer first_file

Another way of doing it is below:

find . -type f -cmin15-prune

Means type file, last modified 15 minutes ago, only look at the current directory. (No sub-directories)

Example 8 – How to find files based on size in Unix and Linux

Following find example shows how you can use find –size option to find files based upon certain size. This willfind all files in current directory and sub-directory, greater than some size using find command in Unix:

find . -size +1000c -execls-l{} \;

Always use a c after the number, and specify the size in bytes, otherwise you will get confuse because find -size list files based on size of disk block. to find files using a range of file sizes, a minus or plus sign can be specified before the number. The minus sign means "less than," and the plus sign means "greater than." Suppose if you want to find all the files within a range you can use find command as in below example of find:

find . -size +10000c -size-50000c-print

This find example lists all files that are greater than 10,000 bytes, but less than 50,000 bytes:

Example 9 – How to find files some days older and above certain size

We can combine –mtime and –size to find files which are some days old and greater than some size in Unix. Very common scenario where you want to delete some large old files to free some space in your machine. This example of find command will find which are more than 10 days old and size greater than 50K.

find . -mtime +10-size +50000c -execls-l{} \;

10) You can use "awk" in combination of find to print a formatted output e.g. next command will find all of the symbolic links in your home directory, and print the files your symbolic links points to:

find . -type l -print|xargsls-ld|awk'{print $10}'

"." says starts from current directory and include all sub directory and "-type l" says list all links.

Hope you find this useful , please share how you are using find commands and we can benefit from each others experience and work more efficiently in UNIX.

Tip: $* : $* is one of the special bash parameterwhich is used to expands positional parameters from position one.
if you give double quotes and expansion is done within double quotes, it only expands to a single word and corresponding value of each parameter will be separated by the first letter of the IFS environment variable defined in bash. Do let me know how do you find these find examples .

How to use find command on file names with space in Unix:

I have received lot of comments from my readers on not mentioning about find -print0 and xargs -0 on find examples, so I thought to include this as well. When we don't specify any expression after find command the default option is -print which prints the name of each found files followed by \n or newline.since we mostly pipe output of find command to xargs -print could cause problem if file name itself contain new line or any form of white space. To resolve this issue instead of -print use -print0. Difference between find -print and find -print0 is, print0 display file name on the stdout followed by a "NUL" character and then you can use xargs -0 command to process file names with null character. let's see UNIX find command example with file name having space in them:

In conclusion always use find -print0 along with xargs -0 if you see slightest possibilities of file names containing space in UNIX or Linux.

Important point about find command in Unix and Linux:

Here are some of the important and interesting things to know about powerful find command, most of these points are contributed by various people in comments and big thanks to all of them for sharing there knowledge, you should definitely check out comments to know more about find command :

1. find –print and find is same as –print is a default option of find command.

2. find –print0 should be used to avoid any issue with white space in file name or path while forwarding output to xargs, also use xargs -0 along with find –print0.

3. find has an option called –delete which can be used in place of -exec rm {} \;

Further Reading
A Practical Guide to Linux Commands, Editors, and Shell Programming (2nd Edition) By Mark G. Sobell
The Linux Command Line: A Complete Introduction by William E. Shotts Jr

46 comments
:

Piping a list of file nnames through "xargs grep" will fail if "find" locates files that contain spaces in their names, since by default "xargs" splits the incoming list on spaces. In that case, use "-print0" on the "find" command to separate file names with nulls, and "-0" on "xargs" to tell it the file names are null separated.

you are right we can use `find . -type f -name "*.txt" -exec rm -f {} \;` instead of xarg as well , both will serve the same purpose. I am bit more comfortable with xargs then -exec so I prefer to use xargs along with find command in unix but you can use -exec as well.

unix find command is something like google search in unix. I really love your practical UNIX command examples. I know when I started working in unix and now after learning find command in unix how much difference it make. unix find command is most powerful utility I come across.

Hi Anonymous, $* or $# or $@ are special bash parameters they have special meaning inside bash script, $# is used to count number of element, $$ used to get process ID , $* and $@ are similar and used to expand positional parameter but they behave differently if they come inside double quotes, $? is used to get exit status of last executed command and $! is used to get process ID of most recent executed command, you can get detailed description here list of special bash parameters in Unix

how about grep command , do you also use grep command in unix or you just use find command. I know unix find command is great but I have found unix grep more easy to use than find command. Its personal choice but find and grep are both powerful and effective.

Hi, I am working on support for electronic trading DMA (Direct to market) access system. which is used to trade cash equities, stocks and options.my system is client connectivity system which connect to different client using FIX Protocol and I want to thank your for your Unix tips on find command and your tips on FIX Protocol, I have benefited a lot.

Poor old Unix! Any good file manager could/should do this with a few clicks without the need of such cryptic commands. Why these commands are not more intuitiv? This is still 1970's style where every bit and byte counted but nowadays it should be more ergonomic and user (not nerd) oriented - even on a text console. It would be great that Unix evolves this way one day.

thanks a lot for this find one liners in Linux. I have been using your find command in Linux and Unix operating system from last few weeks and it helped me a lot. I also liked your grep command tutorial in Unix and Linux .those are my favorite. please do share some more useful unix and Linux command examples.

I think best example of find command in unix is finding files by modified time, creation time etc. but power of unix find command is you can not only find files by names, types, modified time but also on several other attributes of file like finding read only files, finding all executable files in linux etc.

man find | grep --context=5 regex This is my way to know about any find command line option , it will find word regex and print 5 lines around it, which is more than enough to know about how to use find with regex option

find -regex '.*.html'-regex allows you to apply regular expression along with find. it apply regular expression on path name, instead of search for file. Since all files in current directory starts with . it matches pattern starts with . than any character any number of time and ending with .html

fantastic tutorial on find command. You have done an awesome job by compiling these examples on find command. I always forget different options like -mtime or -size, now I can simply take a printout of this and have with me.

Another useful example of find command is that you can you can use find command to find all soft link in any directory on any UNIX based operating system e.g. Linux, Solaris or BSD. by using find -type you can see all symbolic links :

find /home/username -type -l -print

will display all soft links in /home/username directory. isn't it great use of find command ?

Hi, I want to find all files which is more than one month old in Unix box, particularly in log directory and then want to create a tar file or zip file of that with name as file-month-year e.g. app-december-2012.tar or .gz. I have figured out command to find all files which are more than 31 days old in log directory e.g.

find . -type f -mtime +31 -print

but I don't know how to create a tar file out of them and later remove all those files from directory. Please share UNIX script for doing that.

what is find command to search a file in linux?What is find command to find a string in file unixwhat is find command to search a string in a file?what is find command to delete filesWhat is find command to find large files in unix

Instead of xargs -0 one can also use xargs --null option to work with files with space. Its very useful to find some files in directory and then find something inside those files. I love this command truly powerful.

On linux find, -exec supports the \+ as well as \;This appends the filenames to the same command and consequently executes faster as it doesn't need to spin up a new process each time.For instance:find . -iname '*.txt' -exec rm {} \;would executerm a.txtrm b.txt...

find . -iname '*.txt' -exec rm {} \+would executerm a.txt b.txt ...

This may not work with other versions, for instance the one that comes with SunOS. Check the man page.

What is find command to find a string in file unixans) same as next question so same answer

Q) what is find command to search a string in a file?ans ) Below command will search all files with the name "file" and will search a pattern "udzial Means share" in themfind . -name "file" | xargs grep -i "udzial means share"