zmv 在 Mac/zsh-shell 上重命名 Unicode 字符(例如 u0308 'COMBINING DIAERESIS')

zmv 在 Mac/zsh-shell 上重命名 Unicode 字符(例如 u0308 'COMBINING DIAERESIS')

在清理文件服务器时,我发现许多文件名中都有不需要的或非 ASCII 字符。要重命名不需要的文件名,我通常在 OSX 机器上的 zsh shell 中使用方便的 zmv 命令。

为了找到不需要的字符,我使用:LC_ALL=C find . -name '*[! -~]*'

我的查找结果在我的文件名中输出许多 Unicode 字符“COMBINING DIAERESIS”(U+0308)“ü”。(https://www.fileformat.info/info/unicode/char/0308/index.htm)。我在 OSX 上使用 x-term 256 中的 zsh,文本编码:Unicode UTF-8。我的语言环境设置/LC_CTYPE="en_DE.UTF-8")

echo -e 'u\u0308'正确输出 ü。 find . -name '*u<0308>*'(按预期工作 - 请注意,上一个 find 命令中的“<0308>”实际上是一个 ü,它在剪切粘贴过程中被替换到 zsh 窗口中)

如何使用 zmv 替换文件名中的 Unicode 字符(例如 u0308)?这是我目前尝试的方法:

zmv -n '(**/)(*)(#qD.)' '$f:gs/u[$(0308)]/ue'

但这似乎不起作用。

答案1

看起来将多字节字符剪切并粘贴到命令行中是可行的:

> zmv -n '**/*(#qD.)' '$f:gs/ü/ue'
mv -- f1/abcü123 f1/abcue123
mv -- f2/MüüMüM f2/MueueMueM

> zmv -n '**/*ü*(#qD.)' '${f//ü/ue}'
mv -- f1/abcü123 f1/abcue123
mv -- f2/MüüMüM f2/MueueMueM

在某些情况下,您可以使用明确的字符编码,例如在替换中:

> f=Au$'\u308'B
> print $f
AüB
> print ${f//u$'\u308'/ue}
AueB

但这似乎不起作用zmv,可能是因为函数对输入模式的解析zmv

相关内容