≡ Menu

Grep Include Only *.txt File Pattern When Running Recursive Mode

I‘m using Debian Linux as my development workstation. I would like to search a directory called ~/projects/ recursively for “foo” word only for *.txt files. How do I search all text files in ~/projects/ for “foo” word using grep command?

The grep command supports recursive file pattern option as follows:

grep -R "pattern" /path/to/dir/

To limit your search for *.txt, try passing the --include option to grep command

Syntax and examples for --include option

The syntax is:

grep -R --include=GLOB "pattern" /path/to/dir
grep -R --include="*.txt" "pattern" /path/to/dir
grep -R --include="*.txt" "foo" ~/projects/

You can include files whose base name matches GLOB using wildcard matching. A file-name glob can use *, ?, and […] as wildcards, and \ to quote a wildcard or backslash character literally. You can ignore case distinctions in both the PATTERN and the input files with -i optoon i.e. case-insensitive search. In this following example, search for all *.py, *.pl, and *.sh files for “main” word in my /raid6/projects/sysmanagement/ directory:

grep --color -Ri --include="*.py" --include="*.sh" --include="*.pl" "main" /raid6/projects/sysmanagement/

OR

grep --color -Ri  --include=*.{py,pl,sh} "main" /raid6/projects/sysmanagement/

OR a safer option would be (note –color removed and * replaced with \*):

grep -Ri  --include=\*.{py,pl,sh} "main" /raid6/projects/sysmanagement/

The --include option provides you the following advantages:

  1. Speed up the search.
  2. Only match given file pattern.
  3. Do not search for binary files such as compiled files or image files. In other words only look for *.txt or *.py file patterns and so on.
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 9 comments… add one }
  • better October 25, 2012, 7:32 pm

    this isn’t portable and includes lots of annoying GNUisms.

    It is better to use find . -name \*.txt | xargs grep

  • Ryan October 26, 2012, 1:08 am

    It’s really a awful way to use grep that I havn’t seen. I also use find . -name \*.txt | xargs grep before.

  • Chris F.A. Johnson October 26, 2012, 2:39 am

    This matches file names; it doesn’t use globbing:

    grep -R –include=GLOB “pattern” /path/to/dir

    In other words, it will include dot files, which globbing does not.

  • Maik K October 26, 2012, 10:56 am

    How about enabled globstar(which most ppl I know have anyway) and then grep “foo” /path/**.txt ? Works at least in the richer shells like bash or zsh.

  • Pepe October 26, 2012, 3:29 pm

    xargs? ewwwwggg. What real men do is:

    find /some/path -type f -name *.txt -exec grep “pattern” {} +

  • Balakrishnan B October 26, 2012, 4:15 pm

    Zsh Only
    grep “pattern” **/*.txt

    May not work if the number of matching files are too many.

  • Chris F.A. Johnson October 26, 2012, 9:14 pm

    Balakrishnan, ** also works in bash (version 4) with the globstar option.

  • Sid Burn November 16, 2012, 10:40 am

    Real man just use:

    ack –text “pattern”

  • Konrad December 28, 2016, 11:40 am

    +1 to find | xargs grep something

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , ,