파이프 찾기 및 grep이 아무것도 반환하지 않는 이유는 무엇입니까?

파이프 찾기 및 grep이 아무것도 반환하지 않는 이유는 무엇입니까?

grep다음에서 반환된 지정된 파일 내에서 검색을 시도하고 있습니다 find.

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'

이것은 작동하지 않습니다.

그 동안에는 이것이 작동합니다.

grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)

첫 번째 예에 어떤 문제가 있나요?

답변1

첫 번째 경우 grep은 파일 이름 목록을 반환하고 find, 두 번째 경우에는 파일 이름 목록이 grep에 대한 인수이므로 grep이 파일 내부를 검색합니다.

파이프는 명명된 파일이 아닌 표준 입력입니다. 이것이 grep이 다르게 동작하는 이유입니다.
에서 man grep:

grep은 명명된 입력 파일(또는 파일 이름이 지정되지 않은 경우 또는 단일 하이픈 빼기 기호(-)가 파일 이름으로 제공되는 경우 표준 입력)에서 지정된 PATTERN과 일치하는 행을 검색합니다.

답변2

첫 번째 경우에는 grep파일 이름에서 "MyClass"를 찾으려고 시도하고 두 번째 경우에는 파일 내용에서 "MyClass"를 찾으려고 시도하기 때문입니다.

첫 번째는 다음과 같습니다.

find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;

두 번째는 다음과 같습니다.

find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;

답변3

나는 당신의 find명령이 다음과 같아야 한다고 생각합니다.

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

확장자가 있는 파일을 찾고 다음을 포함 mydir합니다 ..java내 수업. 결과 이전에 파일명이 출력됨을 -H나타냅니다 .grep

관련 정보