찾기: -exec에 대한 인수가 누락되었습니다.

찾기: -exec에 대한 인수가 누락되었습니다.

다음 명령을 실행하려고 합니다.

find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +

오류가 반환됩니다.

find: missing argument to -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 '{}' \+

답변1

따옴표 대신 사용된 백틱(나중에 질문 편집에서 제거됨), 필요한 경우 따옴표 누락, 쓸모 없는 추가 따옴표, 그룹 -o절에 대한 괄호 누락 및 find사용된 다른 구현( 자세한 내용은 댓글과 채팅을 참조하세요.)

어쨌든 명령은 다음과 같이 단순화될 수 있습니다.

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} +

또는 구식 GNU 찾기 버전을 사용하는 경우 항상 작동합니다.

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} \;

답변2

"에 대한 인수 누락 -exec"은 일반적으로 -에 대한 인수에 exec종결자가 누락되었음을 의미합니다. 종결자는 문자만 포함하는 인수 ;(셸 명령에서 인용해야 하므로 일반적으로 \;or 로 작성됨)이거나 및 를 ';'포함하는 두 개의 연속 인수 여야 합니다 .{}+

스테판 차젤라스(Stephane Chazelas)가 확인했습니다.-exec … {} +을 지원하지 않는 이전 버전의 GNU find를 사용하고 있다는 것입니다 -exec {} \;. GNU는 의 뒤늦은 채택이었지만 -exec … {} +덜 구식인 도구 모음(예:시그윈, 여기에는 git 및 훨씬 더 많은 기능이 포함됩니다.GNUwin32git이 부족하지만 Cygwin이 제공하는 나쁜 직원이 Linux를 사용하려고 시도하지만 우리가 부과하는 Windows 분위기가 없습니다). 이 기능은 9년 전 버전 4.2.12에 추가되었습니다(GNU findPOSIX 호환 을 위해 마지막으로 확인된 기능이었습니다 ).

이전 GNU 찾기를 고수하려면 -print0with를 사용 xargs -0하여 유사한 기능(그룹화된 명령 실행, 임의의 파일 이름 지원)을 얻을 수 있습니다.

find a/folder b/folder -name '*.c' -o -name '*.h' -print0 | xargs -0 grep -I foobar /dev/null

명령줄 에서는 항상 와일드카드를 인용하십시오 find. 그렇지 않고 파일이 포함된 디렉터리에서 이 명령을 실행하면 .c따옴표가 없는 항목이 현재 디렉터리의 파일 *.c목록으로 확장됩니다 ..c

/dev/null명령줄 에 추가하는 것은 단일 일치 항목을 찾 grep더라도 grep이 항상 파일 이름을 인쇄하도록 하는 방법입니다 . findGNU find의 또 다른 방법은 옵션을 전달하는 것입니다 -H.

답변3

다음과 같은 명령이 있는 경우

find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar {} +

오류를 반환합니다.

find: missing argument to -exec

가능한 원인은 find구문을 지원하지 않는 너무 오래된 GNU입니다 -exec mycommand {} +. 이 경우 저성능 교체는 여러 대상을 수집하고 한 번만 실행하는 대신 발견된 모든 대상에 대해 한 번 -exec mycommand {} \;실행하는 실행입니다 .mycommandmycommand

그러나 GNU는 find다음을 지원하지 않습니다.

find . -type f -and -name "*.ttf" -exec cp {} ~/.fonts +

GNU는 보다 일반적인 조합 대신 find리터럴 조합만 지원하기 때문입니다 . 중괄호와 문자 사이에는 아무 것도 들어갈 수 없습니다. 이것을 시도하면 동일한 오류가 발생합니다.{} +{} additional parameters ++

find: missing argument to -exec

{} additional parameters \;해결 방법은 작동하지만 발견된 모든 대상에 대해 명령을 한 번 실행하는 구문을 사용하는 것입니다 . GNU에서 더 많은 성능이 필요하다면 find주어진 인수에 추가 매개변수를 추가할 수 있는 래퍼 스크립트를 작성해야 합니다. 다음과 같은 것

#!/bin/bash
exec mycommand "$@" additional parameters

충분히 좋아야합니다. 또는 임시 파일을 생성하지 않으려면 단일 라이너를 사용하여 다음과 같이 매개변수 순서를 변경할 수 있습니다.

find . -type f -and -name "*.ttf" -exec bash -c 'mycommand "$@" extra arguments' {} +

실행됩니다 mycommand {list of ttf files} extra arguments. 플래그 다음에 bash에 대한 특수 문자를 두 번 이스케이프해야 할 수도 있습니다 -c.

답변4

나는 과거에 exec 구문 때문에 골치 아픈 일을 겪었습니다. 대부분의 경우 이제는 더 멋진 bash 구문을 선호합니다.

for f in `find a/folder b/folder -name "*.[ch]"`; do grep -I foobar $f; done

각 파일이 순차적으로 평가되므로 파일을 그룹으로 처리하려는 경우 몇 가지 제한 사항이 있지만 출력을 다른 곳으로 파이프할 수 있습니다.

관련 정보