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
...

一致する各ファイルは1行を占めます。

(しかし、間違いなく存在する答えを教えてもらえますか?\;に変更すると、\+ファイルが処理され、出力が次のように処理される理由を理解できますか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

sh2番目のシステムでは、dashまたは他のPOSIXシェルを使用できます。${var/pat/rep}いいえPOSIX パラメータ拡張したがって、POSIXではsh必要ありません。システムにGNU findがあるのでbashもあるかもしれませんので、bashを使用してくださいbash -c(bashismを使用するときはいつものように)。

関連情報