Find specific word in all files in and beneath current directory

I want to find all files, and print the path and filename, for any file where the text "Numlock" is used - whether it is lower-, upper- or mixed-case.

What command should I use ?


You can use grep -r to do a recursive search of file contents e.g.

grep -Iri 'numlock' /path/to/search/dir/

where /path/to/search/dir/ is the top-level directory from which you want to start the search - you could use / but be prepared for it to take a long time.

Some variations, depending on your exact requirement:

  • change the -r option to -R if you wish to follow symbolic links
  • add the -l option to print just the names of the files found

The I tells grep to ignore binary files and the i makes the search case-insensitive.


If your version of grep does not support recursive searching, you can achieve the same thing using a combination of find and grep e.g.

find /path/to/search/dir/ -type f -exec grep --color -HIi 'numlock' {} +

The script below searches (text)files in a given directory recursively, for occurrences of a given string, no matter if it is in upper or lowercase, or any combination of those.

It will give you a list of found matches, the paths to the files, combined with the filenam and the actual occurrences of the string in the file, looking like:

/path/to/file1 ['numlock', 'numlocK']
/longer/path/to/file2 ['NuMlOck']

etc.

To limit the search time, I would look for matches in specific directories, so not for 2TB of files ;).

To use it:

1] Copy the text below, paste it into an empty textfile (gedit). 2] Edit the two lines in the headsection to define the string to look for and the directory to search. 3] Save it as searchfor.py. 4] To run it: open a terminal, type python3+space, then drag the script on to the terminalwindow and press return. The list of found matches will appear in the terminalwindow

In case of an error, the script will mention it.

#!/usr/bin/python3
import os
#-----------------------------------------------------
# give the searched word here in lowercase(!):
searchfor = "string_to_look_for"
# give the aimed directory here:
searchdir = "/path/to/search"
#-----------------------------------------------------
wordsize = len(searchfor)
unreadable = []
print("\nFound matches:")
for root, dirs, files in os.walk(searchdir, topdown=True):
    for name in files:
        file_subject = root+"/"+name
        try:
            with open(file_subject) as check_file:
                words = check_file.read()
                words_lower = words.lower()
                found_matches_list = [i for i in range(len(words_lower)) if words_lower.startswith(searchfor, i)]
                found_matches = [words[index:index+wordsize] for index in found_matches_list]
                if len(found_matches) != 0:
                    print(file_subject, found_matches)
                else:
                    pass
        except Exception:
            unreadable.append(file_subject)
if len(unreadable) != 0:
    print("\ncould not read the following files:")
    for item in unreadable:
        print("unreadable:", item)