특정 문자열의 디렉토리에있는 모든 .java 파일을 grep


12

Mac OS X의 현재 디렉토리 및 모든 하위 디렉토리에서 모든 .java 파일에서 간단한 문자열 (정규식이 아님)을 어떻게 검색합니까? 일치하는 파일 및 디렉토리 이름 목록을 인쇄하고 싶습니다.


이 질문을 해주셔서 감사합니다. 이제 ".git"을 제외시키는 방법을 알아 내야합니다.
Dan Rosenstark

js의 대답이 더 간결하다고 생각하지만 입력해야하지만 여전히 포함해야합니다. 아마도 그것을 숨기기 위해 별명을 쓸 수있을 것입니다.
Craig Tataryn

답변:


19

그리고 항상 인기있는

find . -name '*.java' | xargs grep -l 'string'

편집 (프랭크 슈 체바) :

공백이있는 파일 이름 또는 디렉토리를 처리하는 경우 가장 안전한 방법은 다음과 같습니다.

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

항상 여러 가지 방법이 있습니다.



11

전통적인 유닉스 대답은이 질문에 대해 받아 들인 것입니다.

find . -name '*.java' | xargs grep -l 'string'

이것은 아마도 Java 파일에서 작동하지만 파일 이름의 공백은 전통적인 UNIX 세계보다 Mac에서 훨씬 일반적입니다. 공백이있는 파일 이름이 위의 파이프 라인을 통과하면 xargs는 개별 단어를 다른 이름으로 해석합니다.

당신이 정말로 원하는 것은 경계를 명확하게 만들기 위해 이름을 분리하는 것입니다.

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

대안은 Mark가 제안한 것처럼 run grep을 찾도록하는 것입니다.하지만 많은 파일을 검색하는 경우에는 그 방법이 느려집니다 (전체 파일 목록에서 grep이 한 번이 아니라 한 파일 씩 한 번 호출 됨).


xargs에서 "--replace"옵션을 사용하여 공백이있는 파일 이름을 처리 할 수도 있습니다. ... | xargs-grep 'string' '{}'({}은 파일 이름으로 대체 됨)
arathorn

1
최신 버전의 find (OS X에 설치된 것을 포함하여)는 "-exec <command> {} +"를 지원합니다. 여기서 \; 대신에 더하기 부호는 {}를 "가능한 많은 경로 이름으로 대체합니다" ... 이것은 xargs (1) "와 비슷합니다 (man 페이지에서).
더그 해리스

7

그렙,보다 나은 grep을 사용하여 ACK를 :

ack -l --java  "string" 

3
ack는 기본적으로 Mac OS X에 설치되어 있지 않습니다.
John Topley

나는 "기본적으로"가 무엇을 의미하는지 모른다. 많은 OS에서 설치 대상을 선택하므로 항상 존재하는 프로그램을 찾기가 어렵습니다. 한 번에 C 컴파일러가 항상 있었고 Perl은 드문 경우였습니다.
bortzmeyer

1
이는 표준 OS 설치의 일부임을 의미합니다. Mac에 개발자 도구가 설치되어 있으며 ack를 설치하지 않습니다. 직접 설치해야합니다. 당신이 그것을 가지고 있다면, 그것은 좋은 구문입니다.
John Topley

ack의 경우, 모듈 의존성이없는 단일 Perl 프로그램입니다. ~ / bin 디렉토리에 프로그램을 "설치"할 수 있다면 "ack"처럼 쉽게 "설치"할 수 있습니다.
Andy Lester

4

원하는 경우 실제로 정규 표현식을 사용하고 메타 문자를 피하거나 이스케이프하면 문자열을 검색 할 수 있습니다.

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
grep이 모든 것을 수행한다면 find & xargs를 사용하는 이유는 무엇입니까?
피터 깁슨

참고로, 질문에 나온 내용을 고려할 때, 그 명령에서 큰 "L"이 아닌 작은 "l"이어야합니다.
Craig Tataryn

크레이그가 맞아, 나는 내 대답을 수정했다.
js.

1

이것은 OSX 질문이므로 더 많은 OSX 관련 답변이 있습니다.

명령 행에서 건너 뛰어 find사용 Spotlight하십시오. 훨씬 더 강력합니다!

명령 줄 스포트라이트 – 그립 찾기

대부분의 사람들은 명령 줄에서 Spotlight 검색을 수행 할 수 있다는 것을 모릅니다. 모든 비전 찾기 및 grep 옵션을 기억해야하는 이유와 Spotlight가 작업을 수행하도록 할 수없는 이유는 무엇입니까? Spotlight에 대한 명령 행 인터페이스를 mdfind라고합니다. GUI Spotlight 검색과 동일한 기능을 갖추고 있으며 명령 줄에서 스크립트를 작성할 수 있습니다.


0

이것을 줘 :

grep -rl "string" */*java

1
Mac OS X에서 "grep : * / * java : 해당 파일이나 디렉토리가 없습니다"
John Topley

여기서 문제는 한 레벨 깊이의 * .java 파일 만 찾을 수 있다는 것입니다. IMHO에 대한 Mark Thalman의 답변을 참조하십시오.
Ludwig Weinzierl

죄송합니다. 내 Mac에는 없습니다. grep의 Mac 버전에 -r (재귀) 플래그가 없습니까?
dwj

그것은하지만 내가 아는 문자열을 검색 할 때 얻은 결과는 파일에 있습니다.
John Topley

0

TextWrangler 와 같은 GUI 프로그램을 사용 하여 옵션이 인터페이스에있는 곳에서보다 직관적 인 검색을 수행 할 수도 있습니다 .


0
grep "(your string)" -rl $(find ./ -name "*.java")

대소 문자를 무시하려면 -rl을 -irl로 바꾸십시오. (문자열)은 필요할 때 정규 표현식이 될 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.