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