@StephaneChazelas는 이 Q&A에 다음 솔루션을 게시했습니다."find -exec {} +" 사용에 문제가 있습니다..
$ find . -iname "*.extension" -exec sh -c '
exec <command> "$@" <additional parameters>' sh {} +
여기서 무슨 일이 일어나고 있는 걸까요? 마지막 것은 정확히 무엇을 하는가 sh {}
? find -exec
명령을 달래서 할 일이 있도록 하는 것은 단지 NOOP인 것 같습니다 .
거기에 쉽게 넣을 수 echo {}
있고 잘 작동하는 것 같습니다.
답변1
구문은 다음과 같습니다.
find ... -exec cmd {} +
find
명령 인수 크기 제한을 초과하지 않고 가능한 한 많은 파일 경로 목록을 인수로 사용하여 기준에 따라 가능한 한 많은 파일을 찾고 실행 ...
합니다 .cmd
cmd
필요한 경우 파일 목록을 분할하여 여러 번 호출할 수도 있습니다 . 예를 들어 다음과 같이 호출될 수 있습니다.
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
한 가지 제한 사항은 이것이 {}
마지막이어야 한다는 것입니다. 예를 들어 다음과 같이 쓸 수 없습니다.
find ... -exec cmd {} other args +
';'
대신 사용할 수 있는 것처럼 '+'
.
당신은 쓸 수 있습니다:
find ... -exec echo foo {} +
하지만:
find ... -exec echo {} foo +
따라서 파일 목록 뒤에 몇 가지 추가 매개변수를 추가해야 하는 경우 cmd
쉘을 호출해야 합니다. (쉘을 호출해야 하는 다른 이유는 리디렉션, 파이프, 일부 문자열 확장과 같은 쉘 기능을 사용해야 할 때입니다...)
에서는 is , is , is ... : a, b 및 c 라는 3개의 인수 목록 sh -c 'inline-script' x a b c
에 대해서도 마찬가지입니다 . 그래서:inline-script
$0
x
$1
a
$2
b
"$@"
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
~을 위한인라인 스크립트, $0
(예를 들어 오류 메시지를 표시할 때 사용됨)은 로 설정되고 find-sh
파일 "$@"
목록( find
확장 {}
됨)입니다.
exec
쉘의 특수 내장 기능을 사용하여 :
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
cmd
실행하기 위해 추가 프로세스를 포크하지 말고 동일한 프로세스 내에서 실행하도록 셸에 지시합니다 (실행 중인 셸 프로세스를 이 명령으로 대체). 일부 쉘 zsh
과 일부 구현에서는 ksh
인라인 스크립트의 마지막 명령에 대해 암시적으로 이 작업을 수행합니다( bash
인라인 스크립트에 명령이 하나만 있는 경우에도 마찬가지입니다).