다음 명령을 실행하려고합니다.
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
이것은 오류를 반환합니다 :
find: missing argument to -exec
이 명령의 맨 페이지와 일치하는 것처럼 보이는이 명령의 문제점을 볼 수 없습니다.
-exec 명령 {} +
이 -exec 옵션 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. 명령 내에서 하나의 '{}'인스턴스 만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.
나는 또한 시도했다 :
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. 이 -exec cmd {} +
변종은 POSIX이며 80 년대부터 사용 가능 했지만 GNU는 최근에 상대적으로 최근에 추가 한 것만 발견했습니다 (2005). 무엇을 find --version
말합니까?
-exec {} +
구식 GNU 발견에서는 (비 POSIX) -print0 | xargs -r0
를 사용하여 비슷한 것을 얻을 수 있습니다. 4.1
1994 년부터입니다
-name
패턴 인수가 인용되어야한다고 ( 삭제 된 답변으로) 지적했습니다 -name "*.c" -o -name "*.h"
. -exec
오류 와 관련이 없지만 사실 입니다. Gilles만이 언급하지만 다른 모든 답변은 와일드 카드를 따옴표로 묶는 것을 알 수 있습니다. … (계속)
-name "*.[ch]"
설명없이 이름 표현을 무너 뜨립니다 . 이것은 명령 행을 단순화하고 특히를 제거하는 이점이 있습니다 -o
. 관련된 표현을 찾기 -o
가 어렵습니다. 네 잘못이야. Gilles의 답변과 같이 오류가 발생하지 않도록 명령이 수정 grep
되면 .h
파일 에서만 실행 됩니다 . 해야합니다 '(' -name '*.c' -o -name '*.h' ')'
.
+
끝에 탈출을 시도 했습니까 ?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+