zsh:zmvを使用してファイル名を一括変更するのに問題がある

zsh:zmvを使用してファイル名を一括変更するのに問題がある

ある拡張子から別の拡張子にファイル名を一括変更しようとしています(背景:私のRailsアプリでerbの代わりにhamlを使用しています)。名前変更コマンドを実行すると、次の出力が表示されます。

% zmv '**/*.erb' $1.haml    
zmv: error(s) in substitution:
app/views/l/links/index.html.erb and app/views/index/index.html.erb both map to .haml
app/views/l/links/new.html.erb and app/views/l/links/index.html.erb both map to .haml
app/views/l/links/show.html.erb and app/views/l/links/new.html.erb both map to .haml
app/views/l/links/stats.html.erb and app/views/l/links/show.html.erb both map to .haml
app/views/layouts/application.html.erb and app/views/l/links/stats.html.erb both map to .haml
app/views/u/profiles/_form.erb and app/views/layouts/application.html.erb both map to .haml
app/views/u/profiles/edit.html.erb and app/views/u/profiles/_form.erb both map to .haml
app/views/u/profiles/show.html.erb and app/views/u/profiles/edit.html.erb both map to .haml
app/views/u/user_sessions/new.html.erb and app/views/u/profiles/show.html.erb both map to .haml
app/views/u/users/_form.erb and app/views/u/user_sessions/new.html.erb both map to .haml
app/views/u/users/new.html.erb and app/views/u/users/_form.erb both map to .haml
app/views/u/users/show.html.erb and app/views/u/users/new.html.erb both map to .haml

誰もがこの問題を解決するために正しい方向を教えてもらえますか?

答え1

私はあなたが本当に欲しいものは次のとおりだと思います。

% zmv '(**/)(*).erb' '$1/$2.haml'
#      ^$1  ^$2

括弧を使用して一致グループを作成し、ファイルパスの一致グループを作成し、ファイル名の一致グループを作成する必要があります。また、zmvの2番目の引数も単一引用符で囲む必要があります。

また、実行する前に「-n」を使用してzmvコマンドをテストすることは非常に良い考えです。 (-nは名前が変更されることを示しますが、実際には名前は変更されません。)

答え2

zshあなたはあなたが言及していることを言わなければなりません$1。 2つの可能性があります。

  • 使用するソースパターン部分を括弧で囲みます。たとえば、zmv '(*)/(*).erb' '$1/$2.haml'「$ 1」は最初のものと一致することを意味し、*「$ 1」は$22番目のものと一致することを意味します$2

    [編集する(ありがとうございます。クリ有効であることを示すために使用されます(**/))]角かっこは、複数のディレクトリレベルで使用するのに少し厄介です。 asで書くと、二重(**)アスタリスクは特別な意味を失います(単一のディレクトリレベルにのみ一致します)。そして、通常、/括弧を使用できないので、(**/*)これは有効なパターンではありません。ただし、特別な場合(**/)は有効ですのでzmv '(**/)(*).erb' '$1$2.haml'

  • この-wオプションを使用すると、この場合、各オプションは次のようになります。$N窒素ソースパターンの最初のワイルドカード文字。たとえば、zmv -w '**/*.erb' '$1/$2.haml'好きなようにします。

代替テキストの周囲には常に一重引用符を使用する必要があります(または使用\$)。それ以外の場合、シェルは組み込みコマンドに$達するzmv前にsを展開します。

関連情報