我正在尝试将文件从一个扩展名批量重命名为另一个扩展名(背景:在我的 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 展开。