명령줄에서 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
file 옵션, 이후 -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
읽히지 않기 때문에 이 두 명령을 결합해 본 적이 없습니다 .)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