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