707

In Windows, I would have done a search for finding a word inside a folder. Similarly, I want to know if a specific word occurs inside a directory containing many sub-directories and files. My searches for grep syntax shows I must specify the filename, i.e. grep string filename.

Now, I do not know the filename, so what do I do? A friend suggested to do grep -nr string, but I don't know what this means and I got no results with it (there is no response until I issue a Ctrl + C).

0

15 Answers 15

1118
grep -nr 'yourString*' .

The dot at the end searches the current directory. Meaning for each parameter:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Would find MobileAppServlet.java or MobileAppServlet.class or MobileAppServlet.txt; 'MobileAppASer*.*' is another way to do the same thing.)

To check more parameters use man grep command.

6
  • 23
    What's the business with *? It will either result in shell wildcard expansion (if there are filenames matching the wildcard pattern), or grep will take it as 0-or-more repetition operator for the character preceding *.
    – usta
    Commented Mar 27, 2013 at 6:19
  • 10
    Now let's consider both possibilities for grep -nr MobileAppSer* . 1. Assume we have 3 files in the current directory matching MobileAppSer* wildcard pattern: named MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Then grep will be invoked like this: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. It means search for text "MobileAppServlet.class" in files MobileAppServlet.java, MobileAppServlet.txt, and elsewhere in the current directory - which surely isn't what the user wants here.
    – usta
    Commented Mar 27, 2013 at 6:30
  • 7
    2. In case there are no files in the current directory matching the MobileAppSer* wildcard pattern, grep will receive the argument MobileAppSer* as-is and thus will take it as search for text "MobileAppSe" followed by 0 or more occurrences of "r", so it will attempt to find texts "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", etc. in current directory's files contents - not what the user wants either.
    – usta
    Commented Mar 27, 2013 at 6:36
  • 5
    This is a dubious choice of regex. Usta has pointed this out. Commented Mar 2, 2014 at 19:24
  • I ran grep -nr 'yourString*' . and got some files with "binary file matches". You can add --text or -a to prevent this: grep -anr 'yourString*' .
    – parsley72
    Commented Sep 30, 2022 at 1:46
161
grep -nr string my_directory

Additional notes: this satisfies the syntax grep [options] string filename because in Unix-like systems, a directory is a kind of file (there is a term "regular file" to specifically refer to entities that are called just "files" in Windows).

grep -nr string reads the content to search from the standard input, that is why it just waits there for input from you, and stops doing so when you press ^C (it would stop on ^D as well, which is the key combination for end-of-file).

3
  • 1
    Hey, so if i want to search for a string irrespective of the case, must I do this: grep -i -nr "my word" .
    – kiki
    Commented Nov 9, 2010 at 4:21
  • 3
    @kiki: Yes, which is equivalent to grep -inr "my word" .
    – usta
    Commented Nov 9, 2010 at 6:30
  • 19
    @kiki: -r for grep means search in subdirectories recursively and -n means prefix each line of output with the corresponding line number of the file which contains that line. man grep describes all of this, and much more.
    – usta
    Commented Nov 9, 2010 at 6:38
74

GREP: Global Regular Expression Print/Parser/Processor/Program.
You can use this to search the current directory.
You can specify -R for "recursive", which means the program searches in all subfolders, and their subfolders, and their subfolder's subfolders, etc.

grep -R "your word" .

-n will print the line number, where it matched in the file.
-i will search case-insensitive (capital/non-capital letters).

grep -inR "your regex pattern" .
2
  • 4
    ./* means all files in the current directory, -R means recursive (searching subdirectories etc.) Commented Nov 8, 2010 at 11:27
  • Thanks. And grep -inR "[0-9a-fA-F]{32}" . helps find hashes (which are hex strings) in the files within the current directory. stackoverflow.com/a/25724915/470749
    – Ryan
    Commented Oct 20, 2021 at 14:48
41

There's also:

find directory_name -type f -print0 | xargs -0 grep -li word

but that might be a bit much for a beginner.

find is a general purpose directory walker/lister, -type f means "look for plain files rather than directories and named pipes and what have you", -print0 means "print them on the standard output using null characters as delimiters". The output from find is sent to xargs -0 and that grabs its standard input in chunks (to avoid command line length limitations) using null characters as a record separator (rather than the standard newline) and then applies grep -li word to each set of files. On the grep, -l means "list the files that match" and -i means "case insensitive"; you can usually combine single character options so you'll see -li more often than -l -i.

If you don't use -print0 and -0 then you'll run into problems with file names that contain spaces so using them is a good habit.

3
  • can I exclude certain directories? @muistooshort
    – Fero
    Commented Sep 16, 2016 at 8:56
  • 1
    @Ferologics There should be, check man find from the command line to see what options your find supports. Commented Sep 16, 2016 at 18:06
  • "but that might be a bit much for a beginner" -- the length doesn't change depending on your personal experience! Commented Feb 9, 2023 at 10:22
29
grep -nr search_string search_dir

will do a RECURSIVE (meaning the directory and all it's sub-directories) search for the search_string. (as correctly answered by usta).

The reason you were not getting any anwers with your friend's suggestion of:

grep -nr string

is because no directory was specified. If you are in the directory that you want to do the search in, you have to do the following:

grep -nr string .

It is important to include the '.' character, as this tells grep to search THIS directory.

1
  • Hi, what do i do, if i have to search 2 words with a space in between? Should the words be specified within quotes? i.e grep -nr "my word" .
    – kiki
    Commented Nov 8, 2010 at 12:13
13

Why not do a recursive search to find all instances in sub directories:

grep -r 'text' *

This works like a charm.

1
  • 1
    No need to quote search string with no special chars like spaces Commented Dec 18, 2015 at 3:11
11

Similar to the answer posted by @eLRuLL, an easier way to specify a search that respects word boundaries is to use the -w option:

grep -wnr "yourString" .
2
6

Another option that I like to use:

find folder_name -type f -exec grep your_text  {} \;

-type f returns you only files and not folders

-exec and {} runs the grep on the files that were found in the search (the exact syntax is "-exec command {}").

5
  1. grep -r "yourstring" * Will find "yourstring" in any files and folders

Now if you want to look for two different strings at the same time you can always use option E and add words for the search. example after the break

  1. grep -rE "yourstring|yourotherstring|$" * will search for list locations where yourstring or yourotherstring matches
5
grep -R "string" /directory/

-R follows also symlinks when -r does not.

4

The answer you selected is fine, and it works, but it isn't the correct way to do it, because:

grep -nr yourString* .

This actually searches the string "yourStrin" and "g" 0 or many times.

So the proper way to do it is:

grep -nr \w*yourString\w* .

This command searches the string with any character before and after on the current folder.

1
  • 2
    however grep -nr yourString works too, as it looks for the bare yourString anywhere in the line (or at least it does on my system, OSX Lion) Commented May 10, 2013 at 9:33
2

The following sample looks recursively for your search string in the *.xml and *.js files located somewhere inside the folders path1, path2 and path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

So you can search in a subset of the files for many directories, just providing the paths at the end.

1

Run(terminal) the following command inside the directory. It will recursively check inside subdirectories too.

grep -r 'your string goes here' * 
0
ls | grep -n <word>

Piping ls to grep, so you can search whatever you need inside the directory you currently are. -n is used to show the line.

-3

Don't use grep. Download Silver Searcher or ripgrep. They're both outstanding, and way faster than grep or ack with tons of options.

1
  • 3
    These maybe great tools but this doesn't answer how I would use these tools to accomplish what the OP is asking.
    – jmathew
    Commented Dec 8, 2017 at 15:12

Not the answer you're looking for? Browse other questions tagged or ask your own question.