zmv:替换文件名中的双引号(“)

zmv:替换文件名中的双引号(“)

在 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//"\""/_}'

相关内容