Find files containing string in file name and different string within file?
That's because grep
can't read file names to search through from standard input. What you're doing is printing file names that contain XYZ
. Use find
's -exec
option instead:
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
From man find
:
-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.
[...]
-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 invoca‐
tions 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.
If you don't need the actual matching lines but only the list of file names containing at least one occurrence of the string, use this instead:
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
I find the following command the simplest way:
grep -R --include="*ABC*" XYZ
or add -i
to search case insensitive:
grep -i -R --include="*ABC*" XYZ