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
별도의 변수 입니다.destdir
sh -c
또는 다음을 사용하여 bash
:
destdir=/tmp/dest
find ... -exec bash -c 'cp "${@:2}" "$1"' bash "$destdir" {} +
이는 대상 디렉터리 경로 이름을 별도의 변수로 추출 하지 않고 "$@"
명령줄에 맞게 목록을 적절하게 다시 정렬하기 위해 목록을 "조각화" 하는 것입니다.cp
$1