How Do I Find All Files Containing Specific Text on Linux?
I'm Trying to Find a Way to Scan My Entire Linux System for All Files Containing a Specific String of Text. Just to Clarify, I'm Looking for Text Within the...
I'm trying to find a way to scan my entire Linux system for all files containing a specific string of text. Just to clarify, I'm looking for text within the file, not in the file name.
When I was looking up how to do this, I came across this solution twice:
find / -type f -exec grep -H 'text-to-find-here' {} \;
However, it doesn't work. It seems to display every single file in the system.
Is this close to the proper way to do it? If not, how should I? This ability to find text strings in files would be extraordinarily useful for some programming projects I'm doing.
55 Answers
Do the following:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-ror-Ris recursive,-nis line number, and-wstands for match the whole word.-l(lower-case L) can be added to just give the file name of matching files.-eis the pattern used during the search
Along with these, --exclude, --include, --exclude-dir flags could be used for efficient searching:
- This will only search through those files which have .c or .h extensions:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
- This will exclude searching all the files ending with .o extension:
grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
- For directories it's possible to exclude one or more directories using the
--exclude-dirparameter. For example, this will exclude the dirs dir1/, dir2/ and all of them matching *.dst/:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
This works very well for me, to achieve almost the same purpose like yours.
For more options check man grep.
You can use grep -ilR:
grep -Ril "text-to-find-here" /
istands for ignore case (optional in your case).Rstands for recursive.lstands for "show the file name, not the result itself"./stands for starting at the root of your machine.
You can use ack. It is like grep for source code. You can scan your entire file system with it.
Just do:
ack 'text-to-find-here'
In your root directory.
You can also use regular expressions, specify the filetype, etc.
UPDATE
I just discovered The Silver Searcher, which is like ack but 3-5x faster than it and even ignores patterns from a .gitignore file.
You can use:
grep -r "string to be searched" /path/to/dir
The r stands for recursive and so will search in the path specified and also its sub-directories. This will tell you the file name as well as print out the line in the file where the string appears.
Or a command similar to the one you are trying (example: ) for searching in all javascript files (*.js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
This will print the lines in the files where the text appears, but it does not print the file name.
In addition to this command, we can write this too: grep -rn "String to search" /path/to/directory/or/file -r: recursive search n: line number will be shown for matches
You can use this:
grep -inr "Text" folder/to/be/searched/
grep (GNU or BSD)
You can use grep tool to search recursively the current folder, like:
grep -r "class foo" .
Note: -r - Recursively search subdirectories.
You can also use globbing syntax to search within specific files such as:
grep "class foo" **/*.c
Note: By using globbing option (**), it scans all the files recursively with specific extension or pattern. To enable this syntax, run: shopt -s globstar. You may also use **/*.* for all files (excluding hidden and without extension) or any other pattern.
If you've the error that your argument is too long, consider narrowing down your search, or use find syntax instead such as:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Alternatively, use ripgrep.
ripgrep
If you're working on larger projects or big files, you should use ripgrep instead, like:
rg "class foo" .
Checkout the docs, installation steps or source code on the GitHub project page.
It's much quicker than any other tool like GNU/BSD grep, ucg, ag, sift, ack, pt or similar, since it is built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.
It supports ignore patterns specified in .gitignore files, so a single file path can be matched against multiple glob patterns simultaneously.
You can use common parameters such as:
-i- Insensitive searching.-I- Ignore the binary files.-w- Search for the whole words (in the opposite of partial word matching).-n- Show the line of your match.-C/--context(e.g.-C5) - Increases context, so you see the surrounding code.--color=auto- Mark up the matching text.-H- Displays filename where the text is found.-c- Displays count of matching lines. Can be combined with-H.
Must Read
List of file names containing a given text
First of all, I believe you have used -H instead of -l. Also you can try adding the text inside quotes followed by {} \.
find / -type f -exec grep -l "text-to-find-here" {} \;