I want to traverse all subdirectories, except the “node_modules” directory.
Advertisement
Answer
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
.