I have the following function defined in my .bashrc, but for some reason the --exclude-dir option is not excluding the .git directory. Can anyone see what I've done wrong? I'm using Ubuntu 13.10 if that helps.
function fif # find in files
{
pattern=${1?" Usage: fif <word_pattern> [files pattern]"};
files=${2:+"-iname \"$2\""};
grep "$pattern" --color -n -H -s $(find . $files -type f) --exclude-dir=.git --exclude="*.min.*"
return 0;
}
Make sure not to include a trailing slash when you specify the directory to exclude. For example:
Do this:
$ grep -r --exclude-dir=node_modules firebase .
NOT this:
$ grep -r --exclude-dir=node_modules/ firebase .
(This answer not applicable to OP, but may be helpful for others who find --exclude-dir
not to be working -- it worked for me.)
Do a man grep
on your system, and see what version you have. Your version of grep may not be able to use --exclude-dirs
.
You're really better off using find
to find the files you want, then use grep
to parse them:
$ find . -name '.git' -type d -prune \
-o -name "*.min.*" -prune \
-o -type f -exec grep --color -n -H {} "$pattern" \;
I'm not a fan of the recursive grep
. Its syntax has become bloated, and it's really unnecessary. We have a perfectly good tool for finding files that match a particular criteria, thank you.
In the find
program, the -o
separate out the various clauses. If a file has not been filtered out by a previous -prune
clause, it is passed to the next one. Once you've pruned out all of the .git
directories and all of the *.min.*
files, you pass the results to the -exec
clause that executes your grep command on that one file.
Some people prefer it this way:
$ find . -name '.git' -type d -prune \
-o -name "*.min.*" -prune \
-o -type f -print0 | xargs -0 grep --color -n -H "$pattern"
The -print0
prints out all of the found files separated by the NULL character. The xargs -0
will read in that list of files and pass them to the grep
command. The -0
tells xargs
that the file names are NULL separated and not whitespace separated. Some xargs
will take --null
instead of the -0
parameter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With