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/dirOlder UNIX version should use xargs to speed up things:
find . -type f -exec grep -l "word" {} +
find . -type f -exec grep -l "seting" {} +
find . -type f -exec grep -l "foo" {} +
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"
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop











![HowTo: Use grep Command In Linux / UNIX [ Examples ]](http://s13.cyberciti.org/images/shared/rp/3/15.jpg)

{ 13 comments… read them below or add one }
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
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
Thank you this was very useful for debugging!
This tutorial is very useful .
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!!!’ .
How can I recursively search all files for 2 strings?
I mean, files containing both strings..
Thanks :)
Thanks, changed my default web directory somewhere and now I don’t know where. This will help.
Would you let me know how to add a grep -v to the search , so i can supress some unwanted files?
thanks
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.
You can not pass args to alias. Use bash shell function:
f(){ find . -type f -exec grep -l $1 {} + ; }Run it as:
Hope this helps!
Great thanks Vivek!
Thanks for this information, I was able to get the file I am looking for on my box.
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.