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
なし - セキュリティステッカーを追加