findを使用して、複数のファイルの名前を変更したい(file1…fileNからfile1_renamed…fileN_renamed) コマンド:
find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';'
しかし、このエラーが発生します:
mv: cannot stat ‘filename=./file1’: No such file or directory
ファイル名がシェル変数として解釈されないため、これは機能しません。
承認された回答:
以下は、アプローチの直接的な修正です。
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 versionは、{}を使用しない場合に役立ちます 、
find .... -print0 | xargs --null rm
ここでrm 一度(または多数のファイルで数回)呼び出されますが、すべてのファイルに対して呼び出されるわけではありません。
basenameを削除しました あなたの質問では、おそらく間違っているので、foo/bar/file8を移動します file8_renamedへ 、foo/bar/file8_renamedではありません 。
編集 (コメントで示唆されているように):
- 短縮された
findを追加しましたxargsなし - セキュリティステッカーを追加