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

파일 이름에 공백이 있으면 print0file 옵션, 이후 -0옵션 xargs, 마지막으로 -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

( / from이 vim읽히지 않기 때문에 이 두 명령을 결합해 본 적이 없습니다 .)quickfixerrorfilestdin

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

당신이 사용자가 아니고 vim링크된 질문이 있다고 말했기 때문에 별로 도움이 되지 않는다면, find ... -print0이미 제안한 대로 도움이 될 것입니다.

답변4

pwd찾기 사용:

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

관련 정보