以下は、アプローチの直接修正です。
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
ただし、一致するファイルが多数ある場合、一致mvごとに新しいシェル(を実行する)を開始するため、これは非常に高価です。また、ファイル名に変な文字が含まれていると、爆発します。より効率的で安全なアプローチは次のとおりです。
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
また、奇妙な名前のファイルを操作するという利点もあります。それをfindサポートする場合、これは
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs使用しないときはバージョンが便利です{}のように、
find .... -print0 | xargs --null rm
ここでrmは一度呼び出されます(または多数のファイルで何度か呼び出されます)が、すべてのファイルに対してではありません。
私は削除basenameそれはおそらく間違っているので、あなたに質問を:あなたは、移動するfoo/bar/file8にはfile8_renamed、ありませんfoo/bar/file8_renamed。
編集(コメントで提案されているとおり):
- 短縮
findなしで追加xargs
- セキュリティステッカーを追加
x役に立たない場合:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsバージョンは最初の例と同じ効率を持ちます/