find(1) . -name file.txt -exec grep.1 -H key {} ;
search for files in a directory hierarchy
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
-name pattern
       Base of file name (the path with the leading directories removed) matches shell  pattern  pattern.
       The  metacharacters  (`*',  `?',  and  `[]')  match a `.' at the start of the base name (this is a
       change in findutils-4.2.2; see section STANDARDS CONFORMANCE below).  To ignore  a  directory  and
       the  files  under  it,  use  -prune;  see  an example in the description of -path.  Braces are not
       recognised as being special, despite the fact that some shells including Bash imbue braces with  a
       special  meaning  in  shell  patterns.   The  filename  matching  is performed with the use of the
       fnmatch(3) library function.   Don't forget to enclose the pattern in quotes in order  to  protect
       it from expansion by the shell.
-exec command ;
       Execute  command;  true  if 0 status is returned.  All following arguments to find are taken to be
       arguments to the command until an argument consisting of `;' is encountered.  The string  `{}'  is
       replaced  by  the  current  file name being processed everywhere it occurs in the arguments to the
       command, not just in arguments where it is alone, as in some versions  of  find.   Both  of  these
       constructions  might  need  to be escaped (with a `\') or quoted to protect them from expansion by
       the shell.  See the EXAMPLES section for examples of the use of the -exec option.   The  specified
       command  is  run  once  for each matched file.  The command is executed in the starting directory.
       There are unavoidable security problems surrounding use of the -exec action; you  should  use  the
       -execdir option instead.

-exec command {} +
       This variant of the -exec action runs the specified command on the selected files, but the command
       line is built by appending each selected file name at the end; the total number of invocations  of
       the command will be much less than the number of matched files.  The command line is built in much
       the same way that xargs builds its command lines.  Only one instance of `{}' is allowed within the
       command.  The command is executed in the starting directory.
print lines matching a pattern
-H, --with-filename
       Print  the  file  name  for  each  match.  This is the default when there is more than one file to
       search.
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus
(-) is given as file name) for lines containing a match to the given PATTERN.  By  default,  grep  prints
the matching lines.
Commands separated  by  a ; are executed sequentially; the shell waits for each command to terminate in turn.  The
return status is the exit status of the last command executed.
source manpages: findgrep