Bashワイルドカード変数の置き換え? [コピー]

Bashワイルドカード変数の置き換え? [コピー]

重複の可能性:
バッチの名前変更ファイル

既存の名前に基づいて新しい名前を使用してファイルの名前を変更したいと思います。

lsしたがって、このファイルを使用できる場合

ls blue*+(.png)

名前を次に変更したいです。

mv blue$(*)+(.png) $(1).png

しかし、これは明らかに動作しません。 bash globbingにこれらの変数の構文がありますか、それとも簡単な方法がありますか?

答え1

これを達成するポータブル方法は次のとおりです。

for f in blue*.png; do mv -- "$f" "${f#blue}"; done

mvこれはすべて必要であり、bashすべてのPOSIX互換シェルで実行できます。標準POSIXパラメータ拡張。システムにインストールされているzsh特定のバージョンがありませんrename

答え2

Bashでこれを行う簡単な方法はありませんが、もちろんプレフィックスの削除、拡張子の記憶、拡張子の複数のインスタンスを単一の拡張子に置き換えるなどの手順に問題を分割できます。

for file in blue*+(.png); do tmp="${file#blue}"; extension="${file##*.}"; echo "$file" "${tmp/%+(.$extension)/}.$extension";done

結果が満足であれば入力してください。

^echo^mv

すべての魔法が起こります。 :)

答え3

バッシュ使用:

zsh -c '
  autoload -U zmv
  zmv "blue(*).png" "\$1.png"'

;-)。あるいは、もっと真剣に言えば、zshのzmvはさまざまな名前変更操作のための非常に強力なツールであることがわかります。あなたが思いついたスクリプトとは異なり、このツール(またはmmvや名前変更などの作業専用ツール)は、ファイルが破損しないように細心の注意を払い、極端な場合にはより強力な可能性があります。

答え4

Debianとその派生製品(Ubuntuを含む)には、目的の操作を実行する名前変更コマンドがあります。

rename -n "s/\+\.png/.png/" blue*+.png

実際に名前変更を適用するには、テスト後に -n フラグを削除します。

このコマンドはPerlスクリプトなので、util-linuxファミリのコマンドと混同しないでくださいrenamerename他のディストリビューションではこれを提供することprenameも、rename.plまったく提供しない場合もあります。

関連情報