
恐ろしいタイトルだからすみません。私がやろうとしていることは次のとおりです。形式の名前を持つ1000個のファイルを含むディレクトリがありますFoo_bar_1,...,Foo_bar_1000
。各ファイル名から「バー」を削除したい。単一ファイルの場合、これは簡単です。たとえば、次のようになりますmv Foo_bar_1 Foo_1
。
明らかに、ループを使用してこの方法ですべてのファイルを処理できます。しかし、mv
正規表現コマンドを使用して繰り返さずにこれを行う簡単な方法があるかどうか疑問に思います。どのソースファイルでも式と一致させることができますFoo_bar_*
。今、一致するテキストに「アクセス」する方法はありますか*
?
mv Foo_bar_* Foo_*
私が書きたいのは、ターゲットファイルの2番目のエントリがソースファイルの一致する文字列*
と等しくなければならないということです。*
これはどのように達成できますか?
答え1
ワイルドカードはシェルによって拡張されます。今後コマンドが実行されます。したがって、以下が実行されます。
mv Foo_bar_1 Foo_bar_2 ... Foo_bar_1000 Foo_bar_1 Foo_bar_2 ... Foo_bar_1000
または、同様のファイルがある場合は、Foo_foo_1
2番目のワイルドカードと一致するため、そのファイルも追加されます。
いいえ、できません。
また、mv
単一の宛先のみが許可されます。
ループを作成することができますfor
:
for f in *; do mv "$f" "${f/_bar_/_}"; done
または、バッチの名前変更ツールを使用します。
Perlの名前変更ツール:
rename 's/_bar_/_/' *
「一般」名前変更ツール:
rename '_bar_' '_' *
また見なさい: