Linux / UNIX Recursively Search All Files For A String

by on July 4, 2007 · 15 comments· LAST UPDATED July 4, 2009

in , ,

How do I recursively search all text files for a string such as foo under UNIX / Linux / *BSD / Mac OS X shell prompt?

You can use grep command or find command as follows.

grep command: Recursively Search All Files For A String

cd /path/to/dir
grep -r "word" .

grep -r "string" .
Ignore case distinctions:
grep -ri "word" .

To display print only the filenames with GNU grep, enter:
grep -r -l "foo" .
You can also specify directory name:
grep -r -l "foo" /path/to/dir/*.c

find command: Recursively Search All Files For A String

find command is recommend because of speed and ability to deal with filenames that contain spaces.
cd /path/to/dir
find . -type f -exec grep -l "word" {} +
find . -type f -exec grep -l "seting" {} +
find . -type f -exec grep -l "foo" {} +
Older UNIX version should use xargs to speed up things:
find /path/to/dir -type f | xargs grep -l "foo"
It is good idea to pass -print0 option to find command that it can deal with filenames that contain spaces or other metacharacters:
find /path/to/dir -type f -print0 | xargs -0 grep -l "foo"

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 15 comments… read them below or add one }

1 rjbcollege May 27, 2010 at 10:08 am

That is fantastic, a command that says it does exactly what I’m looking for.

Unfortunately, when I copy and paste the example to recursivle search for files containing a string:
find . -type f -exec grep -l “word” {} +

in to my linux session I get a set of error message lines which all say this:

find: grep: Argument list too long

To fix this, simply add the following to hide any such error messages by oplacing them in the trash:

find . -type f -exec grep -l “word” {} + 2>>/dev/null

Reply

2 Pete Shore July 25, 2010 at 10:51 am

Perfect, had to search a joomla install for all occurrences of a string, used grep as i remember if from my uni days, thanks for the post.

Pete

Reply

3 lanh May 14, 2011 at 5:37 pm

Thank you this was very useful for debugging!

Reply

4 Radhakrishnan July 12, 2011 at 7:06 am

This tutorial is very useful .

Reply

5 Fernando Lopez Jr. October 2, 2011 at 1:24 am

it won’t work if you are trying to search for:

grep -r “test!!!” .

you need to use the single quotations. like:

grep -r ‘test!!!’ .

Reply

6 jinil February 15, 2012 at 4:51 am

How can I recursively search all files for 2 strings?
I mean, files containing both strings..

Thanks :)

Reply

7 analytical February 21, 2012 at 3:28 pm

Thanks, changed my default web directory somewhere and now I don’t know where. This will help.

Reply

8 mica March 30, 2012 at 3:40 pm

Would you let me know how to add a grep -v to the search , so i can supress some unwanted files?

thanks

Reply

9 Ken April 6, 2012 at 10:17 pm

This is indeed great. Now I wanted to shortcut this expression by putting it into my .bash_profile file as an alias but I can’t get that too work. I’ve tried a lot of variations on this theme:

alias f=”find . -type f -exec grep -l $1 {} +”

but then when I type something like “f foobar” it responds with “find: foobar: unknown option”. I’m sure this is stupidly easy but I’ve tried enough variations I thought I’d ask for some help.

Reply

10 nixCraft April 7, 2012 at 10:24 am

You can not pass args to alias. Use bash shell function:

f(){ find . -type f -exec grep -l $1 {} + ; }

Run it as:

f foobar

Hope this helps!

Reply

11 Ken April 10, 2012 at 4:55 pm

Great thanks Vivek!

Reply

12 Arsie May 28, 2012 at 3:23 am

Thanks for this information, I was able to get the file I am looking for on my box.

Reply

13 CaptSaltyJack May 14, 2013 at 3:29 am

Actually, using find to grep files is way slower than using grep -r. Try it, go into a folder with a whole bunch of files (hundreds, if not more), and run:

date ; find . -type f -exec grep somestring {} \; ; date

and then:

date ; grep -r somestring . ; date

The first operation took me about 10 seconds. The second one took about 3-4 seconds.

Reply

14 perfect tutorial February 26, 2014 at 5:01 am

Great article! Just another reason why *nix should be embraced for ever.

Reply

15 Joshua Pinter March 21, 2014 at 7:44 pm

Also, it’s helpful to use the “-n” flag to show the line number of the file the text is on.

Reply

Leave a Comment

Tagged as: , , , , , , , , ,

Previous Faq:

Next Faq: