find ... -exec sh -c를 사용하여 파일 이름 바꾸기가 특정 시스템에서 작동하지 않음 - "잘못된 대체"

find ... -exec sh -c를 사용하여 파일 이름 바꾸기가 특정 시스템에서 작동하지 않음 - "잘못된 대체"

find (GNU findutils) 4.8.0한 시스템(광산)에 다음 명령을 실행하면 가 있습니다.

find . -name '*.cpp' -exec sh -c 'f=$0; echo mv "$f" "${f/cpp/CPP}"' {} \;

나는 다음과 같은 목록을 얻습니다.

mv ./stuff.cpp ./stuff.CPP
mv ./main.cpp ./main.CPP
...

일치하는 각 파일은 한 줄을 차지합니다.

(그런데, 확실히 존재하는 답변을 알려주실 수 있습니까? \;로 변경하면 \+파일이 처리되어 출력이 다음과 같이 처리되는 이유를 이해할 수 있습니까 mv ./stuff.cpp ./stuff.CPP?)

내가 완전히 알지 못하는 다른 시스템에서 위 명령으로 인해 다음과 같은 오류가 발생하는 find것을 확인했습니다.find (GNU findutils) 4.6.0.225-235f

./unittest/tTransform3.cpp: 1: ./unittest/tTransform3.cpp: Bad substitution
./unittest/tTransform2.cpp: 1: ./unittest/tTransform2.cpp: Bad substitution
...

후자의 시스템에 어떤 문제가 있는지 이해하도록 도와줄 수 있는 사람이 있나요?

답변1

sh두 번째 시스템에서는 dash 또는 다른 POSIX 셸을 사용할 수 있습니다. ${var/pat/rep}아니요POSIX 매개변수 확장이므로 POSIX에서는 sh필요하지 않습니다. 시스템에 GNU find가 있으므로 bash도 있을 수 있으므로 bash를 사용하십시오 bash -c(bashism을 사용할 때 항상 그렇듯이).

관련 정보