How can I grep in source files for some text?
At the moment I'm using two commands, I'm sure there must be a better way...
wim@wim-acer:~/ffmpeg$ find . -name "*.h" -print0 | xargs -0 grep -i invalid\ preset
wim@wim-acer:~/ffmpeg$ find . -name "*.c" -print0 | xargs -0 grep -i invalid\ preset
Solution 1:
ack (or, on Debian/Ubuntu, ack-grep) will ignore non-source files like version control or binaries. Very useful.
to search just .c and .h files, as above:
ack-grep -i --cc "invalid preset"
the --cc
(the longer form is --type cc
) only looks at .c .h & .xs files. The full list of filetypes is viewable with ack-grep --help type
. Most of the time, you won't particularly need the --type
, as it will generally only have the files to search, and then files you won't see by default, like binaries, backups and version control files.
Solution 2:
The grep
program itself can search recursively and also accepts an option to search only certain files. The following is equivalent to your two find
commands.
grep -Ri --include=*.[ch] invalid\ preset .
Solution 3:
The find command can call grep itself.
find . \( -name "*.c" -o -name "*.h" \) -exec grep -i "invalid preset" {} \; -print
and variations of thereof.