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

파이핑 find 및 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은 명명된 입력 FILE(또는 파일 이름이 지정되지 않은 경우 표준 입력)에서 지정된 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

관련 정보