web-dev-qa-db-ja.com

zsh:zmvでファイルのバッチ名前を変更する際の問題

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

% 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

誰かが私にこれを修正する正しい方向を示すことができますか?

6
Eimantas

私はあなたが本当に欲しいものはこのようなものだと思います:

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

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

また、実行する前に「-n」を使用してzmvコマンドをテストすることをお勧めします(-nは名前の変更内容を示しますが、実際には名前の変更は行いません)。

7
clee

zshに_$1_が何を指しているかを伝える必要があります。 2つの可能性があります:

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

    [[〜#〜] edit [〜#〜](_(**/)_を指摘してくれた clee に感謝します動作)]括弧は、複数のディレクトリレベルで使用するのが少し厄介です。 _(**)_と書くと、二重アスタリスクはその特別な意味を失います(単一のディレクトリレベルのみが一致します)。また、括弧内で_/_を使用することはほとんどできないため、_(**/*)_は有効なパターンではありません。ただし、特殊なケース_(**/)_は機能するため、zmv '(**/)(*).erb' '$1$2.haml'と書くことができます。

  • _-w_オプションを使用します。この場合、各_$N_は、[〜#〜] n [〜#〜]番目のワイルドカードと一致するテキストに対応します。ソースパターンで。たとえば、_zmv -w '**/*.erb' '$1/$2.haml'_は必要なことを実行します。

置換テキストは常に一重引用符で囲む必要があることに注意してください(または_\$_を使用してください)。そうしないと、_$_ sはzmv組み込みコマンドに到達する前にシェルによって展開されます。