답변:
grep
표준 입력에서 검색 할 파일 이름을 읽을 수 없기 때문 입니다. 당신이하고있는 일은 포함 된 파일 이름 을 인쇄하는 것입니다 XYZ
. 대신 find
의 -exec
옵션을 사용하십시오 .
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
보낸 사람 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.
실제 일치하는 줄이 필요하지 않고 하나 이상의 문자열이 포함 된 파일 이름 목록 만 필요한 경우이를 대신 사용하십시오.
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
… | grep -R 'XYZ'
말도 안 돼. 한편으로 디렉토리 -R 'XYZ'
에서 재귀 적으로 행동하는 것을 의미합니다 XYZ
. 반면 '의 표준 입력 에서 … | grep 'XYZ'
패턴을 찾는 것을 의미합니다 . \XYZ
grep
맥 OS X 또는 BSD에서 grep
처리합니다XYZ
패턴으로 하여 다음과 같이 불평합니다.
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU grep
는 불평하지 않습니다. 오히려, 그것은 취급XYZ
패턴으로 하고 표준 입력을 무시하고 현재 디렉토리에서 시작하여 재귀 적으로 검색합니다.
당신이하려는 것은 아마
find . -name "*ABC*" | xargs grep -l 'XYZ'
… 어떤
grep -l 'XYZ' $(find . -name "*ABC*")
… 둘 다 말해 grep
찾아 보라고한다XYZ
일치하는 파일 이름 .
그러나 파일 이름에 공백이 있으면이 두 명령이 중단됩니다. 구분 기호 xargs
로 사용하여 안전하게 사용할 수 있습니다 NUL.
find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'
그러나 @terdon의 솔루션을 사용하는 find … -exec grep -l 'XYZ' '{}' +
것이 더 간단하고 좋습니다.
find
입니다.