@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
셸을 호출해야 합니다. (쉘을 호출해야 하는 다른 이유는 리디렉션, 파이프, 일부 문자열 확장과 같은 쉘 기능을 사용해야 할 때입니다...)
에서 , sh -c 'inline-script' x a b c
is , is , is ... a, b 및 c라는 3개의 인수 목록도 마찬가지 입니다 . 그래서: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
여기와 같이 인라인 스크립트에 명령이 하나만 있는 경우에도 마찬가지입니다).