Ubuntu – How to find a specific text in files with specific extension

command linefindgrepsearch

Let's say I'm searching for all files with .log extension that contain the text of abc.

When searching for files with any extension would look like
(Ref.: https://unix.stackexchange.com/a/16140/38353 )

find / -xdev -type f -print0 | xargs -0 grep -H "abc"

How could we modify this so that it will search only for files with .log extension?

I'll be more than happy if you show a better command.

Best Answer

TL;DR

Add -iname "*.log" after / to your find command. Refer to man page for more info

A more detailed answer

The task at hand is the following:

  1. List files that match pattern *.log
  2. Execute grep per each file to find whether or not it contains a specific string.
  3. List the filename that has a match on the stdout

The example of how that can be accomplished can be seen bellow:

$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+                      

Essentially there's 3 things at play:

  • find does the job of finding files AND calling grep per list of filenames in the -exec ...{} \+ structure, where {} will be substituted with all the filenames found.
  • -iname "*.log" can provide case-insensetive matching of the filenames
  • -exec . . .{} \+ calls the low-level execve function that will spawn grep -l with the list of all the files found in front of it ( in the place of {} ).
  • The \+ is the option that specifies for execve to pack as any files as possible in front of grep (the limit is set by ARG_MAX variable, is specific to exec, and for Ubuntu is at 2097152 as can be shown by getconf ARG_MAX command ). Once the limit is reached, exec will repeat the call to grep with more files packed as arguments. The \ is necessary to ensure + is interpreted as argument to find and not as another shell command.
  • the -l option or grep shows files with matched string. -L would match files without the string.