
명령줄에서 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
파일 이름에 공백이 있는 경우 파일에는 옵션을, 나중에는 -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
(나는 / 에서 vim
읽지 않기 때문에 이 두 명령을 결합하려고 시도한 적이 없습니다 )quickfix
errorfile
stdin
Vim은 첫 번째 파일을 열고 찾은 /tmp/mystring.list
줄에 직접 커서를 놓습니다 . mystring
을 사용하여 다음 인스턴스로 이동할 수 있으며 를 :cn
사용하여 이전 인스턴스 로 이동할 수 있습니다 :cp
.
귀하가 사용자가 아니고 vim
링크된 질문이 별로 도움이 되지 않는다고 말했으므로 find ... -print0
이미 제안한 대로 도움이 되어야 합니다.
답변4
pwd
찾기로 사용 :
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open