grep -r "texthere" .
The first parameter represents the regular expression to search for, while the second one represents the directory that should be searched. In this case, .
means the current directory.
Note: This works for GNU grep, and on some platforms like Solaris you must specifically use GNU grep as opposed to legacy implementation. For Solaris, this is the ggrep
command.
How to recursively grep all directories and subdirectories?
If you know the extension or pattern of the file you would like, another method is to use --include
option:
grep -r --include "*.txt" texthere .
You can also mention files to exclude with --exclude
.
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’s recursive by default and 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.
Answer #3:
I now always use (even on Windows with GoW — Gnu on Windows):
grep --include="*.xxx" -nRHI "my Text to grep" *
(you can add 2>/dev/null
to void permission denied outputs)
That includes the following options:
--include=PATTERN
Recurse in directories only searching file matching
PATTERN
.
-n, --line-number
Prefix each line of output with the line number within its input file.
(Note: -n
decreases performance a lot, so you might want to skip that option)
-R, -r, --recursive
Read all files under each directory, recursively; this is equivalent to the
-d recurse
option.
-H, --with-filename
Print the filename for each match.
-I
Process a binary file as if it did not contain matching data;
this is equivalent to the--binary-files=without-match
option.
And I can add ‘i
‘ (-nRHIi
), if I want case-insensitive results.
I can get:
/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden;
...
How to recursively grep all directories and subdirectories?
globbing **
Using grep -r
works, but it may overkill, especially in large folders.
For more practical usage, here is the syntax which uses globbing syntax (**
):
grep "texthere" **/*.txt
which greps only specific files with pattern selected pattern. It works for supported shells such as Bash +4 or zsh.
To activate this feature, run: shopt -s globstar
.
git grep
For projects under Git version control, use:
git grep "pattern"
which is much quicker.
ripgrep
For larger projects, the quickest grepping tool is ripgrep
which greps files recursively by default:
rg "pattern" .
It’s built on top of Rust’s regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
Answer #5:
If you only want to follow actual directories and not symbolic links,
grep -r "thingToBeFound" directory
If you want to follow symbolic links as well as actual directories (be careful of infinite recursion),
grep -R "thing to be found" directory
Since you’re trying to grep recursively, the following options may also be useful to you:
-H: outputs the filename with the line
-n: outputs the line number in the file
So if you want to find all files containing Darth Vader in the current directory or any subdirectories and capture the filename and line number, but do not want the recursion to follow symbolic links, the command would be
grep -rnH "Darth Vader" .
If you want to find all mentions of the word cat in the directory
/home/adam/Desktop/TomAndJerry
and you’re currently in the directory
/home/adam/Desktop/WorldDominationPlot
and you want to capture the filename but not the line number of any instance of the string “cats”, and you want the recursion to follow symbolic links if it finds them, you could run either of the following
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
Source:
running “grep –help”
Answer #6:
To find name of files
with path
recursively containing the particular string
use below command for UNIX
:
find . | xargs grep "searched-string"
for Linux
:
grep -r "searched-string" .
find a file on UNIX
server
find . -type f -name file_name
find a file on the LINUX server
find . -name file_name
Answer #7:
If you are looking for a specific content in all files from a directory structure, you may use find
since it is more clear what you are doing:
find -type f -exec grep -l "texthere" {} +
Note that -l
(downcase of L) shows the name of the file that contains the text. Remove it if you instead want to print the match itself. Or use -H
to get the file together with the match. All together, other alternatives are:
find -type f -exec grep -Hn "texthere" {} +
Where -n
prints the line number.
Hope you learned something from this post.
Follow Programming Articles for more!