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