BASH

10 Examples of find command in Unix and Linux

The find command is one of the versatile commands in UNIX and Linux  and I used it a lot in my day to day work. I believe having good knowledge of it and understanding of its different options and usage will increase your productivity a lot in UNIX based operating system e.g. Redhat Linux or Solaris.

If you are a QA, support personnel, and your work involves lots of searching text on a Linux machine or if you are a Java or C++ programmer and your code resides in UNIX, the 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, grep  is another Linux command which provides similar functionality like find.

Like any other command, find’s strength lies in its various options, which are worth learning, but, to be frank, hard to remember. If you are even able to remember the options mentioned in this article, you will be taking much more advantage of the find command, than average developers, QA, support people and Linux users.

If you love to read books,  you can also take a look at The Linux Command Line: A Complete Introduction, a great book and must read for any programmer, tester, system administrator, security guy or developers, who work in UNIX and Linux based environment. It not only teaches about find and grep but also introduces several useful commands, which probably gone unnoticed by most of us.

10 Tips on find command in UNIX

Here I am listing down some of the ways I use to find in Unix or Linux box regularly, I hope this will help someone 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 favorites, if you have something to share please share via commenting.

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

!find will repeat the last find command executed. It saves a lot of time if you re searching for something and you need to execute the same command again and again. In fact “!” can be used with any command to invoke the previous run of that command, it’s one of the special shell characters.

javin@testenv1 ~/java : !find
find . -name "*.java"     --last find command executed
./OnlineStockTrading.java
./StockTrading.java

How to find files which have been modified less than one day, minute or hour in Unix – Example 2

find -mtime is used to search files based upon modification time. This is, in fact, my favorite top while looking out some production issues just to check which files have been modified recently, could be likely cause of  the issue, believe me, it helps a lot and many 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 denotes last accessed time of the 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 a sign is used for exact. For example find –mtime -1 will search all files which have been modified:

javin@testenv1 ~/java : find . -mtime 1  (find all the files modified exact 1 day)

javin@testenv1 ~/java : find . -mtime -1 (find all the files modified less than 1 day)
.
./StockTrading.java

javin@testenv1 ~/java : find . -mtime +1 (find all the files modified more than 1 day)
./.vimrc
./OnlineStockTrading.java
./StockTrading.java~

In this example since we have only modified StockTrading.java some time back it has shown on find –mtime -1, the 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 hold the 777 permission in Unix box – Example 3

find –perm option is used to find files based upon permissions. You can use find –perm 444 to get all files which allow 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 Unix and some chmod examples to change permissions in Unix.

javin@testenv1:~/java $ find . -perm 644
./.vimrc
./OnlineStockTrading.java

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 written permission etc by changing permissions e.g. to find all read-only files in current directory: find . –perm 555.

Here “.” or period denotes the 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 the find is extremely helpful while looking for errors and exceptions in the log file.

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

UNIX find and xargs command Example

Now we will see some UNIX find command example combined with xargs command. A combination of find and  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 the find command in Unix?

In order to delete files, you can use either –delete option of find command or use xargs in combination. It’s better to create housekeeping script for such task which can perform cleanup on a periodic basis.

find . -name "*.tmp" -print | xargs rm –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 whitespace 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 the word “MemoryCache”. we can also leave -print option in all cases because its default for UNIX finds command as pointed out by Ben in comments. You can further sort the result of find command using Sort command in unix.

find . –name "*.txt" –print | xargs grep "Exception"

Example 7 –  Finding files only in current directory not searching on subdirectories:

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

find . -maxdepth 1 -type f -newer first_file

Another way of doing it is below:

find . -type f -cmin 15 -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 will find all files in current directory and sub-directory, greater than some size using find command in Unix:

find . -size +1000c -exec ls -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 the size of the 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. A 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 -exec ls -l {} \;

Example 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 | xargs ls -ld | awk '{print $10}'

“.” says starts from current directory and include all subdirectory 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 parameters which 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 .

Here is a nice summary slide of some useful find command examples, which will help you to get more from this excellent command line tool in UNIX and Linux:

10 Examples of find comand in UNIX

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

I have received a 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 the output of find command to xargs -print could cause a problem if file name itself contain a new line or any form of white space.

To resolve this issue instead of -print use -print0. The difference between find -print and find -print0 is, print0 display file name on the stdout followed by an “NUL” character and then you can use xargs -0 commands to process file names with a null character. let’s see UNIX find command example with a file name having space in them:

javin@testenv1:~/test find . -name "*equity*" -print
./cash equity trading ./equity~

You see here “cash equity trading” has space in there name

javin@testenv1:~/test find . -name "*equity*" -print | xargs ls -l
ls: cannot access ./cash: No such file or directory
ls: cannot access equity: No such file or directory
ls: cannot access trading: No such file or directory
-r--r--r-- 1 stock_trading cash_domain trading 0 Jul 15 11:42 ./equity~

Now if we pass this to xargs, xargs treat them as three separate files.

javin@testenv1:~/test find . -name "*equity*" -print0 | xargs ls

xargs: WARNING: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?

ls: cannot access ./cash: No such file or directory
ls: cannot access equity: No such file or directory
ls: cannot access trading: No such file or directory

Now to solve this, we have used find command with -print0 which appends NUL character on file name but without xargs -0,  xargs command would not able to handle those inputs.

javin@testenv1:~/test find . -name "*equity*" -print0 | xargs -0 ls -l
-rw-r--r-- 1 stock_trading cash_domain trading 0 Jul 21 09:54 ./cash equity trading
-r--r--r-- 1 stock_trading cash_domain trading 0 Jul 15 11:42 ./equity~

Now you can see with find -print0| xargs -0 it looks good.

In short, 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 their 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 the 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 {} \;
Reference: 10 Examples of find command in Unix and Linux from our SCG partner Javin Paul at the Javarevisited blog.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Keith Emery
7 years ago

Very informative. Thank you.

a CLI Noob
a CLI Noob
4 years ago

the source, javarevisited blog, has some helpful summary pics encapsulating this info also.

Back to top button