601

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).

Neuron
  • 3,776
  • 3
  • 24
  • 44
kiki
  • 12,017
  • 16
  • 46
  • 62

14 Answers14

951
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.

Manish Ranjan
  • 9,760
  • 1
  • 14
  • 20
  • 15
    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 Mar 27 '13 at 06:19
  • 8
    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 Mar 27 '13 at 06: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 Mar 27 '13 at 06:36
  • 5
    This is a dubious choice of regex. Usta has pointed this out. – kindasimple Mar 02 '14 at 19:24
129
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).

vinzee
  • 10,965
  • 9
  • 34
  • 51
usta
  • 6,273
  • 2
  • 20
  • 37
  • 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 Nov 09 '10 at 04:21
  • 2
    @kiki: Yes, which is equivalent to `grep -inr "my word" .` – usta Nov 09 '10 at 06:30
  • 16
    @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 Nov 09 '10 at 06:38
69

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" .
Stefan Steiger
  • 68,404
  • 63
  • 337
  • 408
28

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.

mu is too short
  • 396,305
  • 64
  • 779
  • 743
25
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.

Nico Huysamen
  • 9,844
  • 9
  • 54
  • 81
  • 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 Nov 08 '10 at 12:13
8

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

grep -r 'text' *

This works like a charm.

vinzee
  • 10,965
  • 9
  • 34
  • 51
Paxwell
  • 658
  • 10
  • 17
5

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 {}").

jfhfhf839
  • 1,261
  • 10
  • 11
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
Tunaki
  • 116,530
  • 39
  • 281
  • 370
Nwaoga
  • 51
  • 1
  • 2
4
grep -R "string" /directory/

-R follows also symlinks when -r does not.

DimiDak
  • 2,990
  • 1
  • 16
  • 23
2

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.

eLRuLL
  • 17,114
  • 8
  • 67
  • 91
  • 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) – theheadofabroom May 10 '13 at 09:33
2

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" .
Mike Slinn
  • 6,212
  • 5
  • 38
  • 69
1

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

grep -r 'your string goes here' * 
Iwantha
  • 11
  • 3
1

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.

yucer
  • 3,142
  • 1
  • 26
  • 38
-4

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

AAAfarmclub
  • 1,758
  • 15
  • 13
  • 2
    These maybe great tools but this doesn't answer how I would use these tools to accomplish what the OP is asking. – jmathew Dec 08 '17 at 15:12