Let’s say I need to find the function GetTypes() in all C# source file (.cs) the directories/subdirectories.
I used grep -rn GetTypes *.cs, but I got an error with grep: *.cs: No such file or directory. I had to use grep -rn GetTypes *, but in this case it shows all the files not *.cs only.
What command do I need to use to find the string only in .cs files?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
If your shell is bash ≥4, put shopt -s globstar in your ~/.bashrc. If your shell is zsh, you’re good. Then you can run
grep -n GetTypes **/*.cs
**/*.cs means all the files matching *.cs in the current directory, or in its subdirectories, recursively.
If you’re not running a shell that supports ** but your grep supports --include, you can do a recursive grep and tell grep to only consider files matching certain patterns. Note the quotes around the file name pattern: it’s interpreted by grep, not by the shell.
grep -rn --include='*.cs' GetTypes .
With only portable tools (some systems don’t have grep -r at all), use find for the directory traversal part, and grep for the text search part.
find . -name '*.cs' -exec grep -n GetTypes {} +
Method 2
You should check out the billiant little grep/find replacement known as ack. It is specifically setup for searching through directories of source code files.
Your command would look like this:
ack --csharp GetTypes
Method 3
If you use GNU grep, you can specify which files to include in a recursive directory traversal:
grep --include '*.cs' -rn GetTypes .
(where the last period denotes the current working directory as root of the traversal)
Method 4
I’m using a combination of find and grep:
find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto
For find, you can replace . by a directory and remove -name if you want to look in every file.
For grep, -bn will print the position and the line number and --color will help your eyes by highlighting what you are looking for.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0