以下は、アプローチの直接修正です。
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
バージョンは最初の例と同じ効率を持ちます/