47

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

7 Answers 7

63

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

0
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>
3
  • 6
    If there are spaces in any of the file or directory names, use this form: find . -name '*.txt' -print0 | xargs -0 grep <pattern> May 19, 2009 at 13:37
  • 2
    And of course there's the issue of filenames that start with -. Feb 7, 2011 at 12:08
  • grep is faster of find. Aug 16, 2018 at 5:18
2

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

grep <pattern> **/*.txt
1
  • 1
    Only if OP is using zsh, but interesting nonetheless.
    – Law29
    May 14, 2016 at 13:01
1

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

0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
1
  • you might want to use "find . -name '*.txt' -type f -exec grep <pattern> {} +" instead so that it rather behaves similiar the verision with from Mark Robinson - works only with GNU find to my knowledge Jun 10, 2009 at 8:49
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.

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .