48

Given this example folder structure:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

How do I do a recursive text search on all *.txt files with grep from "/"?

("grep -r <pattern> *.txt" fails when run from "/", since there are no .txt files in that folder.)

Brent
  • 24,065

7 Answers7

64

My version of GNU Grep has a switch for this:

grep -R --include='*.txt' $Pattern

Described as follows:

--include=GLOB

Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).

Kyle Brandt
  • 85,693
20

If you have a large number of files it would be useful to incorporate xargs into the command to avoid an 'Argument list too long' error.

find . -name '*.txt' -print | xargs grep <pattern>
Mark
  • 754
2

you might be able to make use of your zsh's EXTENDED_GLOB option (docs)

grep <pattern> **/*.txt
santa
  • 121
1

You may want to take a look at ack at http://betterthangrep.com, which has facilities for selecting files to search by filetype.

1
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
  • 1,468
0

It's 2019 and there's no way I would still use grep for recursive text searching.

IMHO todays answers should include ripgrep:

rg <pattern> -ttxt
santa
  • 121
0

Mannis answer would fork a new grep-process for every textfile. If you have lots of textfiles there, you might consider grepping every file first and pick the .txt-files when thats done:

grep -r <pattern> * | grep \.txt:

That's more disk-intensive, but might be faster anyway.