在 macOS 上使用 zmv,我想用下划线 (_) 替换文件名中的双引号 (")。但是,我无法让 zshexpn 正确隔离 ".我应该使用一些神奇的 zsh/zmv/zshexpn 选项吗?
% zmv -n '(**/)(*)' '$1${(S)2//"/_}'
zmv: syntax error in replacement
% zmv -n '(**/)(*)' '$1${(S)2//\"/_}'
zmv: syntax error in replacement`
% zmv -n '(**/)(*)' '$1${(Sp)2//\"/_}'
zmv: syntax error in replacement
(这是更大的替换非法字符活动的一部分。我希望使用一个 zmv 表达式来完成整个事情。)
感谢您的任何帮助。
答案1
我不知道如何zmv
准确处理第二个表达式,但使用变量来包含引号似乎有效:
quote='"'
zmv -n '(**/)(*)' '$1${2//$quote/_}'
例子:
% find
.
./bar
./bar/Hello, "World".
% zmv -n '(**/)(*)' '$1${2//$quote/_}'
mv -- 'bar/Hello, "World".' 'bar/Hello, _World_.'
答案2
在我的测试中zmv '* *' '$f:gs/"/_'
效果很好。
https://zsh.sourceforge.io/Intro/intro_2.html是一个非常文件通配符的干巴巴的解释。与正则表达式不同,但足够接近以至于令人困惑。
答案3
这是一个解析错误......如果您编辑该zmv
函数并删除Stéphane 提到的2> /dev/null
后面的内容g=${(Xe)repl}
这里您会收到一条附加错误消息:
zmv:257: parse error
zmv: syntax error in replacement
我猜解析错误是由于zsh
期望结束双引号造成的,因为以下工作正常:
zmv -n '(**/)(*)' '$1${2//"\""/_}'