파일을 grep하고 결과 일치 항목 열기

파일을 grep하고 결과 일치 항목 열기

명령줄에서 grep의 일부 반환 값을 기반으로 모든 파일을 열려고 합니다. 이 옵션을 사용하여 파일 이름만 반환할 수 있다는 것을 알고 있지만 -l이를 어떻게든 다른 일련의 플래그나 인수와 결합하여 해당 파일의 전체 경로를 생성하고 싶습니다.

나는 다음과 같은 것을 시도했습니다.

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

또한 다음과 같습니다.

grep -HR -l mystring . | xargs open

거의 성공하지 못했습니다. 모든 하위 디렉토리에도 재귀적으로 들어가고 싶습니다. 나는 보았다이 질문, 완전히 관련이 없습니다.

업데이트:

나는 이런 종류의 일을 할 수 있었다

grep -HR -l mystring . | xargs -L 1 open

문제는 많은 파일에 대해 명령줄이 두 가지 방식으로 불평한다는 것입니다.

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist, 경로에 공백이 있습니다.

답변1

print0파일 이름에 공백이 있는 경우 파일에는 옵션을, 나중에는 -0xargs, 마지막으로 -I {}두 번째에는 옵션을 사용해야 합니다 xargs.

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

emacs명령 으로 테스트했습니다 open.

답변2

-exec입력한 명령의 종료 상태를 가져와 논리적으로 사용합니다.find

따라서 이와 같은 간단한 작업이 작동해야 합니다.

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

답변3

어떤 버전을 사용하고 있는지 잘 모르겠지만 grep맨 페이지를 올바르게 읽고 있다면 grep첫 번째 성공적인 일치 후에 검색이 중지됩니다. 너가 원하는게 그거야? 귀하의 질문에서 제가 이해한 것은 귀하가 "모든 파일 열기"를 원한다는 것입니다.

vim또는 을 사용해도 괜찮다면 gvim다음을 사용할 수 있습니다.

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(나는 / 에서 vim읽지 않기 때문에 이 두 명령을 결합하려고 시도한 적이 없습니다 )quickfixerrorfilestdin

Vim은 첫 번째 파일을 열고 찾은 /tmp/mystring.list줄에 직접 커서를 놓습니다 . mystring을 사용하여 다음 인스턴스로 이동할 수 있으며 를 :cn사용하여 이전 인스턴스 로 이동할 수 있습니다 :cp.

귀하가 사용자가 아니고 vim링크된 질문이 별로 도움이 되지 않는다고 말했으므로 find ... -print0이미 제안한 대로 도움이 되어야 합니다.

답변4

pwd찾기로 사용 :

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

관련 정보