find -exec: {}와 + 사이에 매개변수 추가

find -exec: {}와 + 사이에 매개변수 추가

find를 사용하여 파일을 찾은 다음 디렉터리에 복사하고 싶으므로 다음을 시도합니다.

find . -name '*.png' -exec cp {} /tmp/dest +

그러나 이는 실패한다

find: missing argument to `-exec'

+그것을 a로 바꾸면 작동 ;하지만 cp는 각 파일에 대해 개별적으로 호출됩니다. 양식을 사용할 +때 후행 매개변수(예: 대상 디렉터리)를 어떻게 추가합니까 -exec?

물론 이 경우에는 cp -t다음을 사용하여 명백한 제한 사항을 해결할 수 있습니다.스택 오버플로에 대한 이 기사하지만 그 솔루션은 cp.대신에 rsync, scp 또는 다른 도구를 사용할 것입니다. {}+사이에 매개변수를 추가하는 일반적인 방법이 있습니까 find -exec?

답변1

아니요, 사용하시면 공백 외에 -exec ... {} +아무것도 남지 않을 수도 있습니다 . 이 문제를 해결할 수 있는 방법이 없습니다.{}+

POSIX 표준 사양에서find명령:

-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +

주 표현의 끝은 <semicolon>a 또는 a로 구두점을 찍어야 합니다 <plus-sign>. <plus-sign>두 문자만 포함하는 인수 뒤에 오는 경우 에만 {}주 표현식의 끝을 구두점으로 표시해야 합니다. 다른 용도는 <plus-sign>특별한 용도로 간주되어서는 안 됩니다.

보다 일반적인 해결책은 다음과 같습니다.

find ... -exec sh -c 'cp "$@" /tmp/dest' sh {} +

여기서 sh -c인라인 스크립트는 의 배치 매개변수를 사용하여 실행됩니다 find. 인라인 스크립트 안에는 "$@"전달된 매개변수 목록(개별적으로 인용됨)이 있으며 이를 통해 cp원하는 방식으로 명령줄에 배치할 수 있습니다.

이를 통해 GNU가 아닌 cp(예: 옵션이 없는 macOS 또는 기타 BSD 시스템 -t) 또는 find.

관련된:


아무도 이걸 요구하지 않았지만 어쨌든…

대상 디렉토리를 변수에 넣으십시오 destdir.

destdir=/tmp/dest

find ... -exec sh -c 'destdir=$1; shift; cp "$@" "$destdir"' sh "$destdir" {} +

셸에서의 호출 은 destdir스크립트와는 find별도의 변수 입니다.destdirsh -c

또는 다음을 사용하여 bash:

destdir=/tmp/dest

find ... -exec bash -c 'cp "${@:2}" "$1"' bash "$destdir" {} +

이는 대상 디렉터리 경로 이름을 별도의 변수로 추출 하지 않고 "$@"명령줄에 맞게 목록을 적절하게 다시 정렬하기 위해 목록을 "조각화" 하는 것입니다.cp$1

관련 정보