zsh:使用 zmv 批量重命名文件时出现问题

zsh:使用 zmv 批量重命名文件时出现问题

我正在尝试将文件从一个扩展名批量重命名为另一个扩展名(背景:在我的 Rails 应用程序中使用 haml 而不是 erb)。发出重命名命令时,我得到以下输出:

% 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 的第二个参数也用单引号引起来。

另外,在运行 zmv 命令之前使用“-n”测试它们是一个非常好的主意(-n 会告诉您将重命名哪些内容,但实际上不会重命名任何内容。)

答案2

你需要说出所指的是zsh什么$1。有两种可能:

  • 使用括号将要使用的源模式部分括起来。例如,在 中zmv '(*)/(*).erb' '$1/$2.haml', '$1' 表示与第一个匹配的内容*,并$2表示与第二个匹配的内容$2

    [编辑(谢谢克利用于指出(**/)有效)] 括号在多个目录级别中使用有点尴尬。如果你写成(**),双星号就失去了它的特殊含义(只匹配单个目录级别)。而且您通常不能使用/括号内,因此(**/*)这不是有效的模式。但是,特殊情况(**/)是有效的,因此您可以编写zmv '(**/)(*).erb' '$1$2.haml'.

  • 使用该-w选项,在这种情况下,每个选项都对应于$N源模式中的第一个通配符。例如,zmv -w '**/*.erb' '$1/$2.haml'做你想做的事。

请注意,您必须始终在替换文本周围使用单引号(或使用\$),否则$shell 在到达zmv内置命令之前将 s 展开。

相关内容