"find --exec"의 쉘 변수에 "{}"의 내용을 할당하는 방법

"find --exec"의 쉘 변수에 "{}"의 내용을 할당하는 방법

디렉터리의 각 xml 파일을 반복하고 make NAME=을 실행하는 스크립트를 작성하려고 합니다. 여기서 NM은 파일 이름 빼기입니다 . 변수에 자리 표시자를 할당하는 .xml데 문제가 있습니다 . {}~처럼

find . -iname "*.xml" -exec foo=$(echo {}); gmake NAME=$FOO \;

아무것도 할당되지 않았기 때문에 작동하지 않습니다 $FOO.

답변1

IRC에서 많은 검색을 한 후 누군가 다음 답변을 알려줬습니다.

find . -iname "*.xml" -exec bash -c 'echo "$1"' bash {} \;

또는 내 예에서는 (혼란을 피하기 위해 문자열을 제거하십시오)

find . -iname "*.xml" -exec bash -c 'gmake NAME="$1"' bash {} \;

작동 방식은 bash가 다음 매개변수를 -c매개변수로 취하고, 없어야 bash {}하는 내용을 {}할당하고 , 이를 padding에 사용하는 것입니다 . 예를 들어 내용이 오류 메시지에 사용되기 때문에 단순한 자리 표시자가 아니므 로 또는 같은 것을 사용하고 싶지 않습니다 .$1$0bash$0$0_''

호출당 여러 파일을 처리하려면 bash다음을 수행하세요.

find . -iname "*.xml" -exec bash -c '
   ret=0
   for file do
       gmake NAME="$file" || ret=$?
   done
   exit "$ret"' bash {} +

gmake이 메서드 에는 호출이 실패 할 경우 find종료 상태로 보고된다는 추가 이점이 있습니다 .

더 많은 정보는 다음에서 얻을 수 있습니다.http://mywiki.wooledge.org/UsingFind#Complex_actions

답변2

Simotek의 답변은 훌륭합니다! 한 줄에 많은 파일의 이름을 바꿀 수 있도록 형식을 변경했습니다...

find * -name "*.sh" -exec bash -c 'OLD=$1; NEW=$(echo $OLD | sed s/OLD-NAME.sh/NEW_NAME.sh/g); mv "$OLD" "$NEW"' _ {} \;

관련 정보