"find ... -exec sh -c '...' sh {} +"를 사용하는 이 찾기 명령은 어떻게 작동하나요?

"find ... -exec sh -c '...' sh {} +"를 사용하는 이 찾기 명령은 어떻게 작동하나요?

@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 cis , is , is ... a, b 및 c라는 3개의 인수 목록도 마찬가지 입니다 . 그래서:inline-script$0x$1a$2b"$@"

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여기와 같이 인라인 스크립트에 명령이 하나만 있는 경우에도 마찬가지입니다).

관련 정보