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

2番目の式を正確に処理する方法がわかりませんが、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

これは構文解析エラーです...関数を編集し、zmvStéphaneが述べた次2> /dev/nullの項目を削除するとg=${(Xe)repl}ここ追加のエラーメッセージが表示されます。

zmv:257: parse error
zmv: syntax error in replacement

zsh私は次がうまくいくので、閉じる二重引用符を期待して解析エラーが発生したと推測します。

zmv -n '(**/)(*)' '$1${2//"\""/_}'

関連情報