디렉터리의 각 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
$0
bash
$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"' _ {} \;