Skip to main content
Tips

How to Perform Grep Search on All Files and in All Directories

The versatile grep command lets you perform search for a text in all the files and all the subdirectories of a directory. Here's how to do that.

Abhishek Prakash

Grep is an excellent tool when you have to search on the content of a file.

Usually, you run grep on a single file like this:

grep search_term filename

Grep is quite versatile. If you want to search all the files in a directory with grep, use it like this:

grep search_term *

There is a problem with it. It only searches in all the files in the current directory. It won't search in the subdirectories.

You can make grep search in all the files and all the subdirectories of the current directory using the -r recursive search option:

grep -r search_term . 

You may also specify the directory path if you are not in the directory where you want to perform the search:

grep -r search_term directory_path

That was a quick recap. Let me show you all this in details with proper examples so that it is easier for you to understand.

Grep search in all files of a directory

Here's the directory structure I am going to use in this example. Except empty.txt, all files contain the term 'simple' on which I'll perform the grep search.

abhishek@LHB:~/scripts$ tree
.
├── dir1
│   └── new_script.sh
├── dir2
│   └── your_script.sh
├── dir3
│   ├── empty.txt
│   └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh

3 directories, 6 files

To search for the word 'simple' in all the files of the current directories, just use wild card (*). The wild card actually substitutes with the name of all the files and directories in the current directory.

grep simple *

This will search in all the files in the current directories, but it won't enter the subdirectories. Since you cannot directly grep search on a directory, it will show "XYZ is a directory" error along with search results.

Grep search in all files of a folder
Search in all files of a directory with grep

If you are not in the same directory where you want to perform, you can specify the directory path and end it with /*

grep search_term directory_path/*

Basically, you are using the wild card to expand on all the elements (files and directories) of the given directory.

Now that you know that, let's see how you can perform a recursive search with grep so that it also looks into the files in the subdirectories.

Grep recursive search in all subdirectories of a directory

Grep provides a -r option for the recursive search. With this option, grep will look into all the files in the current (or specified) directory and it will also look into all the files of all the subdirectories.

Here's the recursive search I performed in the previous example to do a grep search in the current folder:

grep -r simple .

Here's the result:

Grep recursive search in all files and all subdirectories
Recursive search with -r option of grep command

There is also a -R option for recursive search and it works almost the same as the -r option.

grep -R simple .

So, what's the difference grep -r and grep -R? Only one, actually. The -R is dereferenced search which means it will follow the symbolic links to go to the original file (which may be located in some other part of the system).

Take a look at the output of the -R search in the same example:

Recursive search with grep including the symbolic links
grep -R recursive search also searches in the linked files

Did you notice that it gives an additional search result with the linked.txt which is basically a symbolic link and was omitted from the grep search with -r option?

If you are not in the directory where you want to perform the recursive search, just provide the absolute or relative path of the directory to grep command:

grep -r search_term path_to_directory

Everything seems good but what if you want to exclude a certain directory from the recursive search? There is a provision for that too. I told you, grep is an extremely versatile command.

grep -r --exclude-dir=dir_name serach_term directory_path

That's not it. You can exclude more than one subdirectory from the recursive search in the following fashion:

grep -r --exclude-dir={dir1,dir2} serach_term directory_path

Here's what excluding directories look like in our example here:

Exclude directories from grep recursive search
Exclude directories from grep recursive search

And yes, as demonstrated by the example above, the exclusion works with both -r and -R recursive options.

To summarize

Here's a quick summary of using grep search for multiple files and directories:

Grep Command Description
grep string * Searches in all the files in current directory
grep string dir Searches in all the files in dir directory
grep -r string . Recursive search in all the files in all the subdirectories
grep -r string dir Recursive search in all files in all the subdirectories of dir
grep -R string . Same as r but follows the symbolic links

I hope you like this quick grep tip. If you want more, you may read this detailed tutorial on using the grep command:

10 Practical Grep Command Examples for Developers
The grep command is used to find patterns in files. This tutorial shows some of the most common grep command examples that would be specifically beneficial for software developers.

Let me know if you have any questions or suggestions on this topic.

Abhishek Prakash