11

Is there a command that allows searching a keyword in files under a directory with specific extension ?

The string grep -irn "string" ./path gives a recursive search for all files under the directory./path. My specific requirement is to search in all files under ./path with an extension such as *.h

10

Set (turn on) the shell option globstar with the command

    shopt -s globstar

This will cause ** as a filename component to mean everything here and below.  So path/** means everything in the path directory and its subdirectories.  (You don't need to type ./ here.)  Then you can use

grep -in "string" path/**/*.h

to search all the .h files in and under path.


You can unset options with shopt -u.

10

After some trials, I think grep -irn 'string' --include '*.h' is more handy

  • 1
    If you're going to do that, be sure to put the "*.h" in quotes. – G-Man Sep 8 '16 at 4:12
  • It works with and without quotes – Ginu Jacob Sep 8 '16 at 4:43
  • 3
    Now it does. Try creating a file called foobar.h in the current directory, and try it again. – G-Man Sep 8 '16 at 5:56
  • That makes sense.... Thanks for that – Ginu Jacob Sep 8 '16 at 6:01
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
  • 1
    -exec ... + is good, too. – G-Man Sep 8 '16 at 3:56
  • 1
    I just noticed — you forgot to include "string" in your answer! – G-Man Sep 8 '16 at 16:29
3

If you can install something on your machine, I suggest using ack.

You can do exactly what you need with it and much more. For your use case, you can do:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filters on h files
  • -i ignores the case

To find which file filters are supported natively, run the command ack --help=type.

  • There's also ag, a former clone of ack. Former, because their feature sets have since diverged somewhat. – 8bittree Sep 28 '16 at 17:24
  • I didn't know ag. Thanks for sharing. – A.D. Sep 29 '16 at 6:58
3

What about this one?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Explanation:

  • -L : follow symlinks
  • -name : using the asterisk, you can describe extensions
  • -in : same as your proposal, but the 'r' is replaced by the find command
  • {} : this stands for the result of the find command
  • \; : in case you combine find with -exec, this is the end-of-command specifier
  • 1
    How does "*.h" work? I would have thought it needed to be '*.h' – Joe Sep 13 '16 at 7:15
  • I always work with double quotes, I don't think it makes a difference. – Dominique Sep 13 '16 at 7:22
0

If you're using gnu grep then it's got a flag that does exactly what you want:

grep -irn --include=\*.h "string" path

although I don't think it's available in other greps.

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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