Exclude .svn directories from grep
If you have GNU Grep, it should work like this:
grep --exclude-dir=".svn"
If happen to be on a Unix System without GNU Grep, try the following:
grep -R "whatever you like" *|grep -v "\.svn/*"
How can I exclude directories from grep -R?
SOLUTION 1 (combine find
and grep
)
The purpose of this solution is not to deal with grep
performance but to show a portable solution : should also work with busybox or GNU version older than 2.5.
Use find
, for excluding directories foo and bar :
find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print
Then combine find
and the non-recursive use of grep
, as a portable solution :
find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;
SOLUTION 2 (using the --exclude-dir
option of grep
):
You know this solution already, but I add it since it's the most recent and efficient solution. Note this is a less portable solution but more human-readable.
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
To exclude multiple directories, use --exclude-dir
as:
--exclude-dir={node_modules,dir1,dir2,dir3}
SOLUTION 3 (Ag)
If you frequently search through code, Ag (The Silver Searcher) is a much faster alternative to grep, that's customized for searching code. For instance, it automatically ignores files and directories listed in .gitignore
, so you don't have to keep passing the same cumbersome exclude options to grep
or find
.
How can I get `find` to ignore .svn directories?
For searching, can I suggest you look at ack ? It's a source-code aware find
, and as such will automatically ignore many file types, including source code repository info such as the above.
excluding .svn .git files from find+xargs+grep pipe
find . -type d '(' -name .svn -o -name .git ')' -prune -o -type f -exec grep -nH -e 'thing' {} +
Using -prune
to avoid recursing into .svn
and .git
directories is better than using a regex. Also -exec
is preferable to -print0 | xargs -0
.
Use grep --exclude/--include syntax to not grep through certain files
Use the shell globbing syntax:
grep pattern -r --include=\*.cpp --include=\*.h rootdir
The syntax for --exclude
is identical.
Note that the star is escaped with a backslash to prevent it from being expanded by the shell (quoting it, such as --include="*.cpp"
, would work just as well). Otherwise, if you had any files in the current working directory that matched the pattern, the command line would expand to something like grep pattern -r --include=foo.cpp --include=bar.cpp rootdir
, which would only search files named foo.cpp
and bar.cpp
, which is quite likely not what you wanted.
Update 2021-03-04
I've edited the original answer to remove the use of brace expansion, which is a feature provided by several shells such as Bash and zsh to simplify patterns like this; but note that brace expansion is not POSIX shell-compliant.
The original example was:
grep pattern -r --include=\*.{cpp,h} rootdir
to search through all .cpp
and .h
files rooted in the directory rootdir
.
Related Topics
Not Authorized for Query on Admin.System.Namespaces on Mongodb
Differencebetween .So and .A Files
How to Emulate the Raspberry Pi 2 on Qemu
Why Does This Code Crash with Address Randomization On
How to Get the Contents of a Webpage in a Shell Variable
Using Grep to Search for a String That Has a Dot in It
Exclude List of Files from Find
Differencebetween Clock_Monotonic & Clock_Monotonic_Raw
Why Can't You Sleep While Holding Spinlock
Archiving Hidden Directories with Tar
Changing Permissions of Files in a Directory Recursively
Tilde Expansion in Environment Variable
Exclude .Svn Directories from Grep