"find ... -exec sh -c '...' sh {} +"를 사용한 find 명령은 어떻게 작동합니까?

"find ... -exec sh -c '...' sh {} +"를 사용한 find 명령은 어떻게 작동합니까?

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

관련 정보